OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3495|回复: 1

求大神指点STM32F103ZET6的SPI1读XPT2046[Alientek 2.8寸 TFTLCD]问题!!!

[复制链接]

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
发表于 2015-11-18 17:18:32 | 显示全部楼层 |阅读模式
5金钱
问题描述:我用SPI1读XPT2046,读回的值都是4063,求大神指点程序哪里出错了?......囧
TFTLCD模块:Alientek 2.8 TFTLCD

一、先上自己的板子LCD接口电路和正点原子(战舰V3)LCD接口电路对比图。


二、我的SPI1初始化程序。
[mw_shl_code=c,true]//SPI1初始化 void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Pe riph_SPI1,ENABLE);//使能PA口和SPI1时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_6); SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode=SPI_Mode_Master; SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial=0x0007;//这也是复位值 SPI_Init(SPI1,&SPI_InitStructure); SPI_Cmd(SPI1,ENABLE);//使能SPI1外设 SPI1_ReadWriteByte(0xFF);//启动传输 }[/mw_shl_code]
[mw_shl_code=c,true]//SPI1读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 u8 SPI1_ReadWriteByte(u8 TxData) { u8 retry=0; while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET) { retry++; if(retry>200) return 0; } SPI_I2S_SendData(SPI1,TxData); retry=0; while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET) { retry++; if(retry>200) return 0; } return SPI_I2S_ReceiveData(SPI1); }[/mw_shl_code]
三、我的读XPT2046函数。
[mw_shl_code=c,true]//XPT2046命令控制字(默认touchtype为0,即竖屏) u8 CMD_RDX=0XD0;//读取x轴坐标命令 u8 CMD_RDY=0X90;//读取y轴坐标命令 //XPT2046读取ADC值 //CMD:指令(CMD_RDX/CMD_RDY) //返回值:读到的数据 u16 XPT2046_Read_ADC(u8 CMD) { vu16 res=0,temp=0; GPIO_ResetBits(GPIOG,GPIO_Pin_11);//选中XPT2046 SPI1_ReadWriteByte(CMD); delay_us(6);//ADC转换时间 res=SPI1_ReadWriteByte(0x00); res<<=8; temp=SPI1_ReadWriteByte(0x00); res|=temp; res>>=3; res&=0xFFF; GPIO_SetBits(GPIOG,GPIO_Pin_11);//释放XPT2046 return res; }[/mw_shl_code]
四、main测试函数部分。
[mw_shl_code=c,true]int main(void) { u16 temp; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 TFTLCD_Init(); SPI1_Init(); TP_Init(); while(1) { if(PEN==0) { temp=XPT2046_Read_ADC(0xD0); printf("X物理坐标:%d\r\n",temp); } } }[/mw_shl_code]
五、串口返回结果。



最佳答案

查看完整内容[请看2#楼]

自己找到问题所在了,症结在于SPI1的引脚应初始化为复用推挽输出,不是普通的推挽输出......囧o(╯□╰)o
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
 楼主| 发表于 2015-11-18 17:18:33 | 显示全部楼层
自己找到问题所在了,症结在于SPI1的引脚应初始化为复用推挽输出,不是普通的推挽输出......囧o(╯□╰)o

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 07:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表