在TFTLCD的例程中的LCD_RD_DATA(void) 函数中,有这样一段
LCD_RD_CLR; //读取数据(读寄存器时,并不需要读 2 次)
if(lcddev.id==0X8989)delay_us(2);//FOR 8989,延时 2us
t=DATAIN;
LCD_RD_SET;
9341不是在RD上升沿读取数据的吗,为什么这里先读了IO口才把RD拉高的,这样不是读不到数据了吗。
求各位大神指教啊。
完整的函数体如下:
u16 LCD_RD_DATA(void)
{
u16 t;
GPIOB->CRL=0X88888888; //PB0-7 上拉输入
GPIOB->CRH=0X88888888; //PB8-15 上拉输入
GPIOB->ODR=0X0000; //全部输出 0
LCD_RS_SET;
LCD_CS_CLR;
LCD_RD_CLR; //读取数据(读寄存器时,并不需要读 2 次)
if(lcddev.id==0X8989)delay_us(2);//FOR 8989,延时 2us
t=DATAIN;
LCD_RD_SET;
LCD_CS_SET;
GPIOB->CRL=0X33333333; //PB0-7 上拉输出
GPIOB->CRH=0X33333333; //PB8-15 上拉输出
GPIOB->ODR=0XFFFF; //全部输出高
return t;
}
那为什么是先读再拉高的呢读的时候并没有上升沿啊
还是不理解9341的写入和读取不都是上升沿的吗。这里先把RD拉低,然后读取IDR的内容,然后再拉高RD。这样上升沿不是发生在单片机读取数据之后吗?怎么能读到正确的数据呢
看中间那三个圆圈下面的话。第一个圆圈那里:在RDX的下降沿,ILI9341就已经把要发给MCU读回的数据放在总线上了,其实这个时候就可以读数据了。
第三个圆圈下面的话说的是ILI9341把总线上的数据撤走,释放总线。而这个动作是发生在RDX的上升沿之后的一段时间。
也就是说,实际上在RDX的下降沿(有一定的时延),ILI9341就已经把给MCU读回的数据发出来了。MCU读了数据之后把RDX拉高,通知ILI9341已经读回了数据,ILI9341可以释放总线了。
懂了,谢谢!
一周热门 更多>