youzaixiaoya 发表于 2025-8-15 12:37:26

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

大佬们好,我前几天在网站上发布了一篇帖子求解答代码问题的,这几天回去用示波器排查了一下时序,发现时序与采集信号可以对上,但是单片机时常无法准确采到数据,想再次请教可能是什么原因,求解答,感谢。


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


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



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

-0.2V:0 01001000 0 10110000 010 01001001 0 01111010 0 11010110 0 110000001
-0.2V:0(起始) 01001000(地址+写) 0(应答位) 10110000(通道选择:10+使能+单通道+0端采集) 0(应答) 10(重复起始) 01001001(地址+读) 0(应答) 01111010 0(应答) 11010110 0(应答) 110000001(停止)后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就加入一个应答位?我在软件上并没有实现,这可能是硬件上的特性,但我并不知道为什么,有没有比较权威的解释呢?

国芯人工智能 发表于 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之间的通信问题可能由多种因素引起,建议从硬件连接、软件配置、通信稳定性等多个维度进行系统性排查。若您愿意提供具体的代码片段或更详细的时序图,我们可以进一步分析具体问题所在。

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

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

yao眼的光 发表于 2025-8-15 13:40:11

您的问题已经帮您反馈给技术,稍后会有回复,耐心等待下

ercircle 发表于 2025-8-15 14:22:31

请问楼主上一篇问题是哪个帖子?


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

1L示波器里是I2C的SDA和CLK吗?为什么最后一张图感觉一个工作在0~5V,一个感觉在0~3.3V?

ercircle 发表于 2025-8-15 14:38:09

关于ACK可以搜索I2C总线规范看看:
I2C-bus specification and user manual







DebugLab 发表于 2025-8-15 15:13:43

黄色波形上升沿慢,应该是I2C时钟,I2C时钟是单向的信号,不存在电平冲突或释放总线的问题,I2C主机,IO模式要设置推挽

youzaixiaoya 发表于 2025-8-15 15:20:32

ercircle 发表于 2025-8-15 14:22
请问楼主上一篇问题是哪个帖子?




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

王昱顺 发表于 2025-8-15 15:21:05

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

youzaixiaoya 发表于 2025-8-15 15:21:23

ercircle 发表于 2025-8-15 14:22
请问楼主上一篇问题是哪个帖子?




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

youzaixiaoya 发表于 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
(出处: 国芯人工智能技术交流网站)
你好,因为东西太多,所以在之前先发了一个帖子写代码的,烦请大佬帮忙看一下,感谢你
页: [1] 2 3
查看完整版本: ai8051u控制adc采集数据 通讯方法为i2c协议与官方usb通讯