问题描述:我用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]
五、串口返回结果。
|