找回密码
 立即注册
查看: 128|回复: 13

8051u的DMA_I2C,发送地址输入到DMA_I2CT_TXAH寄存器的问题。

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-17 08:11:14

1

主题

4

回帖

29

积分

新手上路

积分
29
发表于 2025-4-16 15:35:19 | 显示全部楼层 |阅读模式
我在结构体里面加了个数组成员,存入到DMA_I2CT_TXAH后,发送的数据全是0xFF,也就是根本没有读取到这个数组的指针。
我不使用结构体中的数组,直接声明数组TxBuff[10]    ,DMA_I2CT_TXAL 正常读取地址。这是咋回事,难道我结构体中的数组地址没取对?
DMA_I2CT_TXAH =  (u8)(((u16)(&(I2C_24C16_1.TxBuff[0])))>>8);   //要发送内容地址高8位
DMA_I2CT_TXAL =  (u8)(&(I2C_24C16_1.TxBuff[0]));        //要发送内容地址低8位
22222.png
33333.png
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-16 15:38:00 | 显示全部楼层
在您的问题中,您提到在使用结构体中的数组成员时,DMAI2C模块无法正确读取数据,而直接声明的数组则能够正常工作。这种情况通常与结构体内存对齐、指针操作或编译器优化有关。以下是对问题的详细分析和可能的解决方案。

1. 结构体内存对齐问题
结构体在内存中的布局可能会受到编译器对齐规则的影响。如果结构体中包含不同类型的成员,编译器可能会在成员之间插入填充字节,以确保每个成员按照其类型的要求对齐。这可能导致结构体中数组的地址与您预期的地址不一致。

解决方案:
使用#pragma pack指令强制编译器按照指定的对齐方式排列结构体成员。例如:
  1. c
  2.   #pragma pack(push, 1)
  3.   struct MyStruct {
  4.       u8 someData;
  5.       u8 I2C24C161TxBuff[10];
  6.   };
  7.   #pragma pack(pop)
复制代码
  这样可以确保结构体成员紧密排列,避免填充字节。

2. 指针操作问题
在您的代码中,您使用了&(I2C24C161TxBuff[0])来获取数组的地址。如果I2C24C161TxBuff是结构体中的成员,您需要确保正确地访问结构体实例中的数组。

解决方案:
确保您访问的是结构体实例中的数组,而不是结构体类型本身。例如:
  1. c
  2.   struct MyStruct myInstance;
  3.   DMAI2CTTXAH = (u8)(((u16)(&(myInstance.I2C24C161TxBuff[0]))) >> 8);
  4.   DMAI2CTTXAL = (u8)(&(myInstance.I2C24C161TxBuff[0]));
复制代码

3. 编译器优化问题
编译器可能会对代码进行优化,导致某些操作不符合预期。例如,编译器可能会将结构体中的数组优化为其他形式,或者对指针操作进行优化。

解决方案:
使用volatile关键字声明结构体中的数组,告诉编译器不要对该数组进行优化。例如:
  1. c
  2.   struct MyStruct {
  3.       u8 someData;
  4.       volatile u8 I2C24C161TxBuff[10];
  5.   };
复制代码

4. 检查DMAI2C配置
确保DMAI2C模块的配置正确,特别是地址寄存器的设置。如果地址寄存器设置不正确,DMAI2C模块可能无法正确读取数据。

解决方案:
检查DMAI2C模块的配置,确保地址寄存器(DMAI2CTTXAH和DMAI2CTTXAL)正确设置为数组的地址。

5. 调试和验证
在调试过程中,可以使用调试工具(如JTAG或SWD)查看内存中的实际数据,验证结构体中数组的地址是否正确。

解决方案:
使用调试工具查看结构体中数组的实际地址,并与DMAI2C模块中设置的地址进行比较,确保两者一致。

总结
您遇到的问题可能是由于结构体内存对齐、指针操作、编译器优化或DMAI2C配置不正确导致的。通过强制结构体对齐、正确访问结构体实例中的数组、使用volatile关键字防止编译器优化,以及检查DMAI2C配置,可以解决这个问题。如果问题仍然存在,建议使用调试工具进一步验证内存中的实际数据。

希望这些建议能帮助您解决问题。如果还有其他疑问,请随时提出。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-16 16:27:49 | 显示全部楼层
没这么干过,问一下AI:

截图202504161627441697.jpg

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-16 16:28:07 | 显示全部楼层
看着不是语法问题
看下是不是内存对齐问题
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=16306

也可以工程发上来看看
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-17 08:11:14

1

主题

4

回帖

29

积分

新手上路

积分
29
发表于 2025-4-16 16:28:40 | 显示全部楼层
还是不行,哎,我发 了源码,帮忙看看。在24c16.c和.h中。

10-8051u_DMA IIC_OLED_xdata_buffer-AT24C16.zip

273.1 KB, 下载次数: 1

点评

[attachimg]93934[/attachimg] 我在库函数例程里复现了你的问题,xdata关键字放在结构体实例前就好了,不要放在结构体定义里试下。  详情 回复 发表于 2025-4-16 16:59
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-16 16:59:26 | 显示全部楼层
64152*** 发表于 2025-4-16 16:28
还是不行,哎,我发 了源码,帮忙看看。在24c16.c和.h中。


截图202504161659128017.jpg
我在库函数例程里复现了你的问题,xdata关键字放在结构体实例前就好了,不要放在结构体定义里试下。
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-16 17:01:16 | 显示全部楼层

截图202504161700388292.jpg
截图202504161701094526.jpg
AI8051U-SOFTWARE-LIB-test-副本.zip (2.14 MB, 下载次数: 0)

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-16 17:04:07 | 显示全部楼层
结构体里u8类型声明xdata编译器会报错。数组不会,可能也是个编译器问题。
截图202504161703557985.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2218

回帖

5450

积分

版主

积分
5450
发表于 2025-4-16 18:47:34 | 显示全部楼层
如6#所述,keil的帮助里,对于这种结构体指向指定内存的情况,也是用的在声明结构体的时候指定,而不是在结构体内指定内存类型

截图202504161846388284.jpg
另外,C44错误的补充说明中也提到了,不可以在结构体中指定内存类型
截图202504161846532407.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-17 08:11:14

1

主题

4

回帖

29

积分

新手上路

积分
29
发表于 2025-4-17 08:26:05 | 显示全部楼层
在声明struct I2C_24Cxx xdata I2C_24C16_1 ;的时候使用xdata成功了。能正常识别地址了。
但又出现新的问题了。当不使用xdata来声明的时候,又不能正确读取地址了。见楼下
结构体声明使用xdata.png
结构体声明使用xdata1.png
结构体声明使用xdata2.png

点评

缓冲区必须使用XDATA! https://www.stcaimcu.com/forum.php?mod=viewthread&tid=15528#pid150267  详情 回复 发表于 2025-4-17 08:57
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:41 , Processed in 0.362033 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表