新手上路
- 积分
- 48
- 金钱
- 48
- 注册时间
- 2016-6-20
- 在线时间
- 5 小时
|
1金钱
本帖最后由 O-Y-T 于 2019-12-10 15:30 编辑
使用ST7789V的 3-line Serial接口
在驱动液晶之前,为了测试连接及时序是否正常,尝试先读取设备ID,参看数据手册Read Function部分,读取设备ID,以及后面04H寄存器部分
可知在写完命令(d/c=0)后,应该有8bit的dummy(空周期)之后才能正常读数,04H的flow chart中同样提供了信息
接下来贴出实现代码:
unsigned int Serial_ReadId(void)
{
unsigned short addr=0x0004;
unsigned int id=0;
addr|=(LCD_COMMAND<<8);
SDA_Write();
LCD_CS_H;
LCD_SCL_L;
delay_ns(60); //预留时间让引脚状态固定
LCD_CS_L;
for(int i=8;i>=0;i--)//传输9个bit
{
if((addr>>i)&0x0001)
LCD_SDA_H;
else
LCD_SDA_L;
delay_ns(60);
LCD_SCL_H;
delay_ns(60);
LCD_SCL_L;
} //写入地址
delay_ns(60);
SDA_Read();
for(int i=31;i>=0;i--){
LCD_SCL_H;
delay_ns(60);
LCD_SCL_L;
delay_ns(60);
if(i<=31)
id|=(SDA_READ<<i);
} //读出id
LCD_CS_H;
delay_ns(60);
return id;
}
上述代码读出id为0x858552ff,上述代码没有加dummy clock,读出数据不太正常,按照上面的分析,读数应该为0x**858552,其中**部分对应8bit 的dummy clock,理论上应该为任意值,考虑到SDA有上拉,应该为0xff858552
但如果按照手册,加了8bit dummy clock后读数就会变成0x008552ff,于是我怀疑是不是数据手册有疏漏,于是试了试读其他寄存器
当然,如果只是这样就不会浪费大家时间了,我再次尝试读取DAH/DBH/DCH
按照数据手册,这三个寄存器分别是ID的第1/2/3个byte,也即0x85,0x85,0x52,且读取这三个寄存器不需要dummy clock
同样用上面的程序读取之后,当然改成读取8bit,得到的值为0x0b/0x0b/0xa5
补充:
1.主频72Mhz,MCU为 STM32F103C8
可能原因:
1.延时问题,仿真和实际运行均为上述结果,故不可能
2.时序不正确,SDA在写完地址后确实有数据返回,故不可能
3.芯片手册不对应,粗略的看了一下矽创的有3-line serial接口的芯片,时序和dummy clock部分都是一样的
想了两天还是没找到原因,希望有做过的大神不吝赐教,或者有底层驱动可以参考一下
|
最佳答案
查看完整内容[请看2#楼]
自己来回答一下,事实上读驱动的问题还是这样,读出来的不对
但是写没什么问题,所以放弃读寄存器了
这个问题也不算解决,不过我看市面上大部分的代码和例程,甚至询问液晶厂厂家给出来的答复也是一般不读寄存器
总之先结题吧,要是有人遇到这个问题拗不过去,不妨先试试直接写sleep out 和 display on 寄存器看看液晶能否被点亮,能够点亮一般是时序没啥问题
|