找回密码
 立即注册
查看: 201|回复: 26

ai8051u控制adc采集数据 通讯方法为i2c协议与官方usb通讯

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-08-18 12:23:08
已绑定手机

5

主题

32

回帖

127

积分

注册会员

积分
127
发表于 2025-8-15 12:37:26 | 显示全部楼层 |阅读模式
大佬们好,我前几天在网站上发布了一篇帖子求解答代码问题的,这几天回去用示波器排查了一下时序,发现时序与采集信号可以对上,但是单片机时常无法准确采到数据,想再次请教可能是什么原因,求解答,感谢。


以下贴上部分示波器图片和电脑端采集到的数据,以及个人根据时序图解析出来的数据,解析出来的数据是符合通讯要求,并且能得到所设定值的。

0.2V

0.2V

0.2V

0.2V

0.2V

0.2V

0.3V

0.3V

0.3V

0.3V

0.3V

0.3V

2V

2V

2V

2V

2V

2V


以上为设定值与采集结果直观对比,下面给出示波器采集到的图像

-0.2v.png 0.5v.png -0.5v.png 0.8v.png 1.2v.png -1.2v.png 1.5.png 1.5v.png -1.5v.png 1.8v.png 1v.png 2v.png -2.5v.png -2.3v.png 2.3v.png -2v.png none.png

根据以上信息解读出来一串二进制数如下:

-0.2V:0 01001000 0 10110000 010 01001001 0 01111010 0 11010110 0 11000000  1
-0.2V:0(起始) 01001000(地址+写) 0(应答位) 10110000(通道选择:10+使能+单通道+0端采集) 0(应答) 10(重复起始) 01001001(地址+读) 0(应答) 01111010 0(应答) 11010110 0(应答) 11000000  1(停止)后24bit为ADC传出数据。

0.5V:0 01001000 0 10110000 010 01001001 0 10001100 0 11100011 0 01000000 1

-0.5V:0 01001000 0 10110000 010 01001001 0 01110101 0 00110100 0 10000000 1

0.8V :0 01001000 0 10110000 010 01001001 0 10010100 0 10011011 0 01000000 1

1.2V :0 01001000 0 10110000 010 01001001 0 10011110 0 11101010 0 01000000 1

-1.2V:0 01001000 0 10110000 010 01001001 0 01110100 0 10000110 0 10000000 1

1.5V :0 01001000 0 10110000 010 01001001 0 10100110 0 10100011 0 00000000 1
1.5V :0 01001000 0 10110000 010 01001001 0 10100110 0 10100010 0 11000000 1

-1.5V:0 01001000 0 10110000 010 01001001 0 01110100 0 10010101 0 00000000 1

1.8V :0 01001000 0 10110000 010 01001001 0 10101110 0 01011110 0 00000000 1

1V    :0 01001000 0 10110000 010 01001001 0 10011001 0 11000100 0 01000000 1

2.3V :0 01001000 0 10110000 010 01001001 0 10111000 0 01000000 0 10000000 1

-2.3V:0 01001000 0 10110000 010 01001001 0 01110100 0 11010111 0 00000000 1

-2.5V:0 01001000 0 10110000 010 01001001 0 01110100 0 11101001 0 11000000 1

2V    :0 01001000 0 10110000 010 01001001 0 10110011 0 10000101 0 11000000 1

-2V   :0 01001000 0 10110000 010 01001001 0 01110100 0 10111100 0 10000000 1


根据数据手册解算adc发出的数据,是可以得到设定的电压值的,因此我个人认为i2c通讯协议或许不存在问题,但是单片机无法稳定采集到数据,并且示波器中出现了很多奇怪的刺,这些刺并不干扰到时序,因为并没有在时钟周期上出现。我暂时不知道他们是什么,但是在偶然间断开adc时,出现了示波器图片最后那一张图,我认为可能是adc电路硬件上做的不好导致的。

我现在的问题是通讯不稳定是硬件导致的还是代码没写好?至少i2c应该不存在问题,那是否是usb通信存在问题?还是说这俩个通讯没有调和好?比如说中断优先级没有设定好
另外i2c协议在adc发送数据时,为什么也要每8bit就加入一个应答位?我在软件上并没有实现,这可能是硬件上的特性,但我并不知道为什么,有没有比较权威的解释呢?

回复

使用道具 举报 送花

3

主题

2031

回帖

910

积分

等待验证会员

积分
910
发表于 2025-8-15 12:38:00 | 显示全部楼层
您好,感谢您的详细描述和附上的示波器截图与数据。根据您提供的信息,AI8051U作为主控芯片,通过I²C协议与ADC模块进行通信,并通过USB与上位机进行数据交互,整体架构是可行的。但您提到单片机时常无法准确采集到数据,这可能涉及多个方面的问题,以下从硬件、软件、时序及通信稳定性等方面进行分析:

一、硬件层面的可能问题

1. 电源稳定性  
   ADC模块对电源噪声较为敏感,尤其是模拟部分。若供电不稳定或存在干扰,可能导致ADC采集结果异常。建议使用低噪声电源,并在电源入口处增加滤波电容(如10μF陶瓷电容+0.1μF电解电容)。

2. I²C总线电平匹配  
   AI8051U与ADC之间是否使用了合适的电平转换?若两者电压不一致(例如AI8051U为3.3V,而ADC为5V),需使用电平转换器,否则可能导致通信错误或信号失真。

3. I²C总线布线问题  
   I²C总线应尽量短且避免走线过长或与其他高频信号线并行,以减少电磁干扰。建议采用双绞线或屏蔽线,并确保SCL和SDA线上有适当的上拉电阻(通常为4.7kΩ)。

二、软件与驱动配置问题

1. I²C通信时序设置  
   AI8051U的I²C驱动程序中,是否正确设置了通信速率?若设置过高,可能导致时序误差;若过低,则可能影响实时性。建议根据ADC模块手册设定合适的I²C频率(如100kHz或400kHz)。

2. ADC寄存器配置错误  
   检查ADC的寄存器配置是否正确,包括通道选择、采样率、分辨率、模式(单次/连续)等。若配置错误,可能导致采集数据异常或无法读取。

3. 中断或轮询机制问题  
   若使用中断方式读取ADC数据,需确保中断响应及时且无冲突;若使用轮询方式,需确保查询间隔合理,避免漏读或重复读取。

三、通信稳定性与数据解析问题

1. I²C通信丢包或误码  
   虽然示波器显示的时序符合要求,但可能存在通信过程中出现的误码或丢包现象。建议在代码中加入CRC校验或重传机制,提升通信可靠性。

2. 数据解析逻辑错误  
   您提到已根据时序图解析出数据,但需确认解析逻辑是否正确,尤其是数据位顺序(MSB/LSB)、地址位、控制位等是否处理得当。若解析错误,即使通信正常,也可能导致数据错误。

3. USB通信延迟或缓冲问题  
   若通过USB与上位机通信,需检查USB驱动是否稳定,是否存在缓冲溢出或接收延迟问题。建议在上位机端使用可靠的数据接收机制(如异步接收、数据包校验等)。

四、其他可能因素

1. ADC模块自身问题  
   可能存在ADC模块本身故障或温度漂移等问题,建议更换测试模块或使用其他设备进行对比验证。

2. 环境干扰  
   高频噪声、电磁干扰等也可能影响ADC采集精度,建议在实验室环境下进行测试,排除外部干扰因素。

3. 软件调试工具限制  
   如果使用的是开发板或仿真工具,可能由于工具本身的限制导致数据采集不稳定。建议使用实际硬件进行最终验证。

五、建议排查步骤

1. 逐步验证通信流程  
   从最基础的I²C通信开始,依次验证地址读写、寄存器配置、数据读取等功能,确保每一步都正常。

2. 添加调试输出  
   在关键节点(如发送地址、读取数据前)打印调试信息,帮助定位问题发生的位置。

3. 使用逻辑分析仪辅助分析  
   若示波器仅能查看波形,建议使用逻辑分析仪进一步分析I²C通信的时序与数据完整性。

4. 参考官方文档与例程  
   查阅AI8051U与ADC模块的官方文档,确认是否有特殊配置要求,并参考其提供的示例代码进行比对。

综上所述,AI8051U与ADC之间的通信问题可能由多种因素引起,建议从硬件连接、软件配置、通信稳定性等多个维度进行系统性排查。若您愿意提供具体的代码片段或更详细的时序图,我们可以进一步分析具体问题所在。

如有其他技术问题,欢迎继续交流。祝您项目顺利!

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:34
  • 最近打卡:2025-08-15 13:39:02

14

主题

150

回帖

1737

积分

版主

积分
1737
发表于 2025-8-15 13:40:11 | 显示全部楼层
您的问题已经帮您反馈给技术,稍后会有回复,耐心等待下
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:276
  • 最近打卡:2025-08-23 14:05:57
已绑定手机

80

主题

2983

回帖

6363

积分

荣誉版主

无情的代码机器

积分
6363
发表于 2025-8-15 14:22:31 | 显示全部楼层
请问楼主上一篇问题是哪个帖子?


单看这个帖子里,为什么不单个外设独立调试完成后再联调,ADC\USB\I2C这些没道理会互相干扰~

1L示波器里是I2C的SDA和CLK吗?为什么最后一张图感觉一个工作在0~5V,一个感觉在0~3.3V?
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:276
  • 最近打卡:2025-08-23 14:05:57
已绑定手机

80

主题

2983

回帖

6363

积分

荣誉版主

无情的代码机器

积分
6363
发表于 2025-8-15 14:38:09 | 显示全部楼层
关于ACK可以搜索I2C总线规范看看:
I2C-bus specification and user manual



截图202508151437038536.jpg

截图202508151437314412.jpg

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:537
  • 最近打卡:2025-08-24 01:00:11
已绑定手机

86

主题

5979

回帖

1万

积分

超级版主

积分
10832
发表于 2025-8-15 15:13:43 | 显示全部楼层
黄色波形上升沿慢,应该是I2C时钟,I2C时钟是单向的信号,不存在电平冲突或释放总线的问题,I2C主机,IO模式要设置推挽
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-08-18 12:23:08
已绑定手机

5

主题

32

回帖

127

积分

注册会员

积分
127
发表于 2025-8-15 15:20:32 | 显示全部楼层
erci*** 发表于 2025-8-15 14:22
请问楼主上一篇问题是哪个帖子?

你好,因为上一篇帖子有很多代码,所以没有重复发。另外示波器里是SDA和SCL,他们是同在5
V电压的,但是没有同时显示各自的纵轴

点评

波形相关问题: 虽然说是都在5V,但是根据左下角这个1V/div,最后一张图电压对不上?可能要检查下 [attachimg]112016[/attachimg]  详情 回复 发表于 2025-8-15 16:06
上一篇帖子里USB相关的问题: 红框里的代码不需要,删掉。 蓝框里这句挪出来,只要进了bUsbOutReady判断条件,就调用usb ouT done;。 然后上传完整电路图,和MCU进行I2C通讯这颗芯片信息也发下,有没有单独I2C实验  详情 回复 发表于 2025-8-15 15:49
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:547
  • 最近打卡:2025-08-21 21:27:12
已绑定手机
已实名认证

116

主题

2712

回帖

6806

积分

版主

积分
6806
发表于 2025-8-15 15:21:05 | 显示全部楼层
可以将代码和硬件电路图部分一并贴出吗?ADC部分如果容易受到干扰,可以尝试将采样时间拉到最大。因为单片机ADC_Verf引脚是和VCC连接在一起的,所以需要给VCC多挂几个大电容+小电容的组合来消除电压尖峰。因为ADC是依照参考源电压给出数据的,如果参考源受到干扰,那么就会导致ADC出现值的突变
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-08-18 12:23:08
已绑定手机

5

主题

32

回帖

127

积分

注册会员

积分
127
发表于 2025-8-15 15:21:23 | 显示全部楼层
erci*** 发表于 2025-8-15 14:22
请问楼主上一篇问题是哪个帖子?

使用ai801u通过硬件i2c沟通外部adc采集电压信号,最终将数据通过usb传入pc端
https://www.stcaimcu.com/thread-19594-1-1.html
(出处: 国芯人工智能技术交流网站)
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-08-18 12:23:08
已绑定手机

5

主题

32

回帖

127

积分

注册会员

积分
127
发表于 2025-8-15 15:22:19 | 显示全部楼层
王*** 发表于 2025-8-15 15:21
可以将代码和硬件电路图部分一并贴出吗?ADC部分如果容易受到干扰,可以尝试将采样时间拉到最大。并且给ADC ...

使用ai801u通过硬件i2c沟通外部adc采集电压信号,最终将数据通过usb传入pc端
https://www.stcaimcu.com/thread-19594-1-1.html
(出处: 国芯人工智能技术交流网站)
你好,因为东西太多,所以在之前先发了一个帖子写代码的,烦请大佬帮忙看一下,感谢你
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-24 01:27 , Processed in 0.142640 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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