之前手头有块2.8寸的ILI9341串口屏,只要4个IO口的那种,后面发现屏幕这个屏幕不管是走模拟SPI还是硬件SPI,屏幕刷新都很慢,后来我又买了个并口的ILI9341显示屏,接口很多的那种,但是原子哥的代码都是模拟SPI,本来以为串口屏和并口屏的硬件SPI应该是一样的,于是我照着串口屏的硬件SPI,修改了下并口屏的SPI,结果发现,SPI怎么都读不出数据,读出来要么不对 要么老是0,原始代码中的模拟SPI 每次读取的都是16位数据,但是写入的数据都是8位,所以我好郁闷,这个并口屏的硬件SPI要怎么读写数据。求大神指点。下面是SPI的读写函数
[mw_shl_code=c,true]//SPI写数据
//向触摸屏IC写入1byte数据
//num:要写入的数据
void TP_Write_Byte(u8 num)
{
#if 0
//模拟SPI的代码
u8 count=0;
for(count=0;count<8;count++)
{
if(num&0x80)TDIN=1;
else TDIN=0;
num<<=1;
TCLK=0;
TCLK=1; //上升沿有效
}
#else
//我修改的硬件SPI的代码
TCS=0; //选中触摸屏IC
SpiReadWriteByte(num);
//SPI_Writebyte(num);
TCS=1; //释放片选
#endif
}
//SPI读数据
//从触摸屏IC读取adc值
//CMD:指令
//返回值:读到的数据
u16 TP_Read_AD(u8 CMD)
{
//模拟SPI的代码
#if 0
u8 count=0;
u16 Num=0;
TCLK=0; //先拉低时钟
TDIN=0; //拉低数据线
TCS=0; //选中触摸屏IC
TP_Write_Byte(CMD);//发送命令字
delay_us(6);//ADS7846的转换时间最长为6us
TCLK=0;
delay_us(1);
TCLK=1; //给1个时钟,清除BUSY
TCLK=0;
for(count=0;count<16;count++)//读出16位数据,只有高12位有效
{
Num<<=1;
TCLK=0; //下降沿有效
TCLK=1;
if(DOUT)Num++;
}
Num>>=4; //只有高12位有效.
TCS=1; //释放片选
#else
//我修改的硬件SPI的代码,这个读取的数据不正常,不知道咋改
u16 Num=0;
TCS=0; //选中触摸屏IC
SpiReadWriteByte(CMD);
//delay_us(6);//ADS7846的转换时间最长为6us
Num = SpiReadWriteByte(0xFF);
//Num = SPI_Readbyte(CMD);
Num>>=4;
TCS=1; //释放片选
#endif
return Num;
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>