给我你的心好吗 发表于 2025-3-26 01:53:51

各位大佬有没有硬件IIC(使用DMA)的例程,我自己的程序死活驱动不了OLED

事情是这样的,看AI8051U的手册里面,讲DMA_I2CT的部分(我也是只需要发送功能就行了),感觉没有讲的很明白:

1,如果使能硬件IICT的DMA,那么IIC的时序部分也是由DMA托管了是吗,不需要我们手动触发起始和停止条件了是吗?

2,硬件IICT的DMA的发送地址寄存器TXAH和TXAL这个地址是指xdata u16*还是xdata u16**?如果有xdata u8 array,我看SPI的示例程序是把(u8)(&array)赋值给了TXAL,把(u8)((u16)&array>>8)赋值给XTAH。

3.DMA_I2C_ST说是“传输字节控制”,可是前面不是已经有DMA_I2CT_AMT和DMA_I2CR_AMT了吗,没搞懂这个寄存器是干嘛的{:4_167:}{:4_167:}
有懂得佬踢一下我感谢

国芯人工智能 发表于 2025-3-26 01:58:00

针对您提出的关于AI8051U硬件IIC使用DMA驱动OLED的问题,以下是对您问题的详细解答:

1. 硬件IIC的DMA托管时序:
当使能硬件IIC的DMA功能后,IIC的时序部分确实由DMA托管。这意味着起始条件、停止条件以及数据传输的时序控制都由硬件自动完成,无需手动触发。您只需配置好DMA传输的相关参数,硬件会自动处理IIC的时序。

2. 发送地址寄存器TXAH和TXAL的地址类型:
TXAH和TXAL用于指定DMA传输的起始地址。对于xdata u8 array,您需要将数组的地址低8位赋值给TXAL,将地址高8位赋值给TXAH。具体操作如下:
   c
   TXAL = (u8)(&array);
   TXAH = (u8)((u16)&array >> 8);
   这里,&array是数组的首地址,将其强制转换为u16类型后,分别取低8位和高8位赋值给TXAL和TXAH。

3. DMAI2CST寄存器的功能:
DMAI2CST寄存器用于控制传输的字节数。尽管DMAI2CTAMT和DMAI2CRAMT寄存器也涉及传输字节数的控制,但DMAI2CST寄存器通常用于在传输过程中动态调整或监控传输的字节数。具体功能可能因芯片设计而异,建议查阅芯片手册以获取更详细的说明。

总结:
在配置硬件IIC的DMA时,确保正确设置TXAH和TXAL寄存器,以指向正确的数据传输地址。同时,理解并合理使用DMAI2CST寄存器,以确保数据传输的准确性和完整性。通过正确配置这些寄存器,您的程序应能成功驱动OLED。

如需进一步调试,建议使用调试工具逐步检查寄存器的配置和传输过程,以确保每一步都按预期执行。

[本文内容由国芯人工智能辅助生成,仅供参考]

DebugLab 发表于 2025-3-26 06:18:34

unsigned char xdata xxx[] _at_ 0x****
这样在指定地址声明xdata数组
或者不用_at_,让编译器自动分配地址,然后用&取址送给TXAH和TXAL
DMA是批量发送数据阶段使用的,起始和停止还有设备地址这些还是要直接写寄存器操作的
还包括OLED的设置内存寻址模式、设置列地址、设置页地址等操作
一般使用DMA_I2CT_AMT设置发送字节数,没用过DMA_I2C_ST

ercircle 发表于 2025-3-26 08:21:22

这个例程包里有例子APP_DMA_I2C
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=14189&highlight=%E4%BC%A0%E7%BB%9F%E5%BA%93%E5%87%BD%E6%95%B0&page=1&extra=#pid143974

给我你的心好吗 发表于 2025-3-26 11:22:38

DebugLab 发表于 2025-3-26 06:18
unsigned char xdata xxx[] _at_ 0x****
这样在指定地址声明xdata数组
或者不用_at_,让编译器自动分配地址 ...

好的,谢谢您

给我你的心好吗 发表于 2025-3-26 11:23:02

ercircle 发表于 2025-3-26 08:21
这个例程包里有例子APP_DMA_I2C
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=14189&highlight= ...

好的,我看一看
页: [1]
查看完整版本: 各位大佬有没有硬件IIC(使用DMA)的例程,我自己的程序死活驱动不了OLED