本帖最后由 zhjerry 于 2022-8-9 11:58 编辑
希望您了解12864或12232并口(6800接口)写入时序。可以参考 <https://blog.csdn.net/baidu_25117757/article/details/113664351> 中的程序。我这个12232的液晶的左右61列分别受到E1、E2的控制。为了从FSMC得到6800接口我使用了2个GPIO(bLcdE1 , bLcdE2)和NWE信号分别或非后得到E1,E2。我这里的写入数据程序片段如下:
if(LcdColumn<=60) {
bLcdE1 = 0;
*(vu16*)(LcdKeyA0) = (uint16_t)(0xB8 + (LcdLine^2)); //LcdCmdMode
*(vu16*)(LcdKeyA0) = (uint16_t)LcdColumn; //LcdCmdMode
*(vu16*)(LcdKeyA1) = (uint16_t)Data; //LcdDataMode
DelayFiFo();
bLcdE1 = 1;
}
else {
bLcdE2 = 0;
*(vu16*)(LcdKeyA0) = (uint16_t)(0xB8 + (LcdLine^2)); //LcdCmdMode
*(vu16*)(LcdKeyA0) = (uint16_t)(LcdColumn-61); //LcdCmdMode
*(vu16*)(LcdKeyA1) = (uint16_t)Data; //LcdDataMode
DelayFiFo();
bLcdE2 = 1;
}
LcdColumn += 1;
以前使用STM32没有DelayFiFo(),点亮LCD完全符合设计。
改用AT32无法点亮LCD。发现上述写入信号和GPIO错步造成E1、E2无效,加入DelayFiFo()可以补偿错步。DelayFiFo()必须是20个连续的NOP。
由于我不需要实际的片选信号所以可以在4个BANK任意选择运行。
STM32的RM有提到在BANK2、BANK4有写入FIFO,避开后BANK发现实体完全符合RM描述, 不需要DelayFiFo();
AT32的RM有提到在BANK2有写入FIFO,实测任何BANK都有FIFO的存在。
如果不是我这个特殊的设计不会特别关注这个FIFO的存在。实际上我一个读写CF卡的程序使用到片选和多条地址线,STM32和AT32无区别运行。
|