zhjerry 发表于 2022-8-2 10:13

XMC能否失能写FIFO?

原来使用STM32的FSMC操作68总线的LCD,这个LCD有2个写入脚E1,E2使用2个GPIO和NWE#信号经过或非门获得,操作完全正常。使用AT32F403A代替后居然无法点亮LCD。经过艰苦查找发现AT32的写入信号与程序逻辑不符,从而与GPIO失调,再而无法得到正确的E1、E2信号。

原来是AT32F403A的XMC写入FIFO造就了这些问题。现在加入硬延时解决了这个问题。
这个特性可以说是AT32F403A的长处但是也造成了与STM32的不兼容。
请问有办法把这个写入FIFO禁止吗?RM里面没有找到。

tanleitanlei 发表于 2022-8-8 14:04

你好!看你这边的描述说XMC存在写入FIFO,不知道你是如何判断XMC存在写入FIFO的呢? RM内是没有 XMC FIFO描述的。XMC时序部分与Sxx大同小异,具体时序的差异可以描述详细一些吗,我这边好确认你所描述的问题

zhjerry 发表于 2022-8-9 11:55

本帖最后由 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无区别运行。



页: [1]
查看完整版本: XMC能否失能写FIFO?