文章描述了使用STM32F407通过SPI通信实现了ADS1256的轮询功能。解决了使用过程中,各个通道之间数据读取串码的问题。SPI通信可以使用硬件SPI通信,也可以使用I/O模拟SPI通信。区别在于硬件SPI通信的过程中不会被中断打断,具有较高的稳定性,但是代码移植性不高。在实现软件SPI通信成功后,硬件SPI也是非常简单的。

阅读数据手册

数据手册这里只列举关键部分的内容。

读懂一些必须的Timing

t1:表示的是SPI的SCLK最小时钟周期,τCLKIN 为 ADS1256 的 输入时钟周期,按照该芯片推荐的7.68MHz 的时钟可知 τCLKIN = 130ns,故 t1 为 520ns。
t 2H 和 t 2L:由 t1 可知二者必须都大于200ns,切相加要大于520ns。
t6:在发送读取命令(RDATA,RDATAC和RREG)后,需要延时6.51us,可以取10us。
t11:上一个命令的最后时钟周期的下降沿到下一个命令的第一个时钟周期的上升沿之间的时间。

t17:这是指在没有更新通道的情况下,每次数据更新的时间,即16 × 0.13us = 2.08us,同是可以推出30000SPS采样率的情况下DRDY为低电平的窗口时长为 1/30000 - 2.08 = 31us。这是一个非常重要的信息,也是解决问题的关键。



t18:根据描叙,t18 是从信号在模拟输入端被改变后,传输到数字滤波器后需要的时间,之后数据才是可读的,这时DRDY引脚被拉低。
表格13,表示的是在不同的采样率下数据建立的时间(t18),图18表示的是在SYNC命令或者硬件SYNC生效后,数据索取时序图。

轮询的原理


轮询各通道的时序图如上。结合上一节读懂的Timing,可以设计如下软件设计思路:
1 等待DRDY拉低,按照上述写寄存器命令设置下一个要读取的通道。
2 发送SYNC命令,同步A/D转换。在下一个命令到来前需要延时 t11 = 24 × 0.3us = 3.12us,这里取5us。
3 发送WAKEUP命令,使SYNC命令生效。

SYNC命令在WAKEUP命令的第一个时钟下降沿生效。生效后DRDY立即变为高电平。(在WAKEUP后面延时视情况而定,只要WAKEUP命令 + 延时 + RDATA命令 + t 6 + 接受数据的总时间 不超过 t 18即可。)
4 发送RDATA命令,延时 t 6 后接受上个通道的数据。(这里解释下,每次设置好某一通道后,需要经过t18后,该通道的数据转换才完成)

数据读取错误或者各通道出现相同的数据的问题

本次实验的软件思路为:用定时器每隔一秒触发轮询四个通道(无论是差分还是单个),同时将DRDY设置为外部中断,当两个中断的中断标志位均为 “1” 时,则设置一个通道并读取上一个通道的数据。
解决办法分为两步:1 在保证SPI通信稳定且准确的情况下,尽量提高通信速率。2 在定时器中断标志位为“1”后,必须要在新的DRDY中断标志位置 “1” 后,立即执行轮询代码(原因后面会讲)。
这是主函数WHILE部分代码:

while(1)         {u16 show_y = 210;//轮询部分if(TIME3_Overflow_Count_By_1_1s == 1)            //定时器中断标志位为1{DRDY_GET_LOW = 0;                                     //在轮询前,先将DRDY中断标志位置“0”for(i = 0; i < 4096; i++)ADS1256_Cycling_Visit();TIME3_Overflow_Count_By_1_1s = 0;}//轮询部分ADS1256_Data_Convert(g_tADS1256.AdcCh1);for(i = 0; i < 1024; i++){average += convert[i]/1024;}temp = average;average = 0;if(temp < 0){temp = -temp;LCD_ShowChar(120,show_y,'-',16,0);LCD_ShowxNum(130,show_y,(temp/1000000),1,16,0);LCD_ShowxNum(150,show_y,((temp%1000000)/100000),1,16,0);LCD_ShowxNum(160,show_y,(((temp%1000000)%100000))/10000,1,16,0);LCD_ShowxNum(170,show_y,((((temp%1000000)%100000))%10000)/1000,1,16,0);}else{LCD_ShowChar(120,show_y,' ',16,0); LCD_ShowxNum(130,show_y,(temp/1000000),1,16,0);LCD_ShowxNum(150,show_y,((temp%1000000)/100000),1,16,0);LCD_ShowxNum(160,show_y,(((temp%1000000)%100000))/10000,1,16,0);LCD_ShowxNum(170,show_y,((((temp%1000000)%100000))%10000)/1000,1,16,0);}}

轮询函数:先设置通道,然后读取上个通道的数据。

void ADS1256_Cycling_Visit(void)
{ADS1256_Change_CH();ADS1256_Read_Previous_Data();
}

设置通道函数:

void ADS1256_Change_CH(void)
{while(DRDY_GET_LOW == 0){;}          //等待新的DRDY中断标志位DRDY_GET_LOW = 0;if(g_tADS1256.ScanMode == 0)ADS1256_SetChannal(g_tADS1256.Channel);  //切换模拟通道 ///delay_us(5);elseADS1256_SetDiffChannal(g_tADS1256.Channel); /* 切换差分模拟通道 */ADS1256_WriteCmd(CMD_SYNC);delay_us(4);ADS1256_WriteCmd(CMD_WAKEUP);delay_us(25);
}

读取上一个通道数据函数:

static void ADS1256_Read_Previous_Data(void)
{static u16 count;if (g_tADS1256.Channel == 0){g_tADS1256.AdcCh4[count] = ADS1256_Read_DOUT_Data();  /* 注意保存的是上一个通道的数据 */}else if(g_tADS1256.Channel == 1){g_tADS1256.AdcCh1[count] = ADS1256_Read_DOUT_Data();   /* 注意保存的是上一个通道的数据 */}else if(g_tADS1256.Channel == 2){g_tADS1256.AdcCh2[count] = ADS1256_Read_DOUT_Data();}else if(g_tADS1256.Channel == 3){g_tADS1256.AdcCh3[count] = ADS1256_Read_DOUT_Data();}if (++g_tADS1256.Channel >= 4){g_tADS1256.Channel = 0;count++;if(count >= 1024)count = 0;}
}

现在来解释其中的原因:

1 在保证SPI通信稳定且准确的情况下,尽量提高通信速率。


图中第一条时序线为DRDY,第二条为DOUT,第三条为DIN,第四条为SCLK。

在不同的采样率下,都必须让A(设置通道的时间) + B(SYNC命令 + t11)落在DRDY为低电平的时间窗口内,否则匹配不了ADS1256的SPI协议。如图:

在刚刚设置好通道后,DRDY就进入下一个低电平窗口期了,这就直接导致后面传输错误。同时也是因为通信频率太慢的原因,上次读取数据还没结束,下一次的通道设置又开始了。

2在定时器中断标志位为“1”后,必须要在新的DRDY中断标志位置 “1” 后,立即执行轮询代码


在判断定时器溢出后,但此时DRDY已经拉低了一段时间了,导致设置通道导函数部分依然超过了DRDY为低电平的窗口期,WAKEUP命令还没来得及激活SYNC命令,使得DRDY拉高,也就是没进入轮循模式。故期间DRDY又有拉低的情形。想想看,如果设置函数从DRDY低电平窗口的其它时间点开始,会有更明显的错误。故在轮询前,先将DRDY中断标志位置“0”。

ADS1256实现轮询相关推荐

  1. 与现代传感器的接口:轮询ADC驱动程序

    与现代传感器的接口:轮询ADC驱动程序 Interfacing with modern sensors: Polled ADC drivers 我们研究了在现代嵌入式应用程序中,开发人员应该如何创建一 ...

  2. 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析

    本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务 ...

  3. VS2013自带的Browser Link功能引发浏览localhost网站时不停的轮询

    浏览localhost网站时候不管你打开那个页面它都会不停的轮询.据悉这是VS2013自带的Browser Link功能,里面用到SignalR机制 什么是Browser Link功能,什么是Sign ...

  4. jQuery 一次定时器_干货 | 小论定时器玩法(时间轮询法)

    EEWORLD 电子资讯 犀利解读 技术干货 每日更新 经常来说,对于一些不复杂的单片机应用,而且对于内存和存储要求比较严格,又需要多分时去处理一些指定的任务,在无法使用RTOS的情况下,使用一个硬件 ...

  5. 一个非常简单的 ASP.NET MVC 示例:长轮询(又叫:反向 AJAX,英文名:Comet)实现...

    关于 长轮询(又叫:反向 AJAX,英文名:Comet)的介绍,请查看:反向Ajax,第1部分:Comet介绍 下面是代码实现: UI: <p><input type="b ...

  6. 用了这么久配置中心,还不知道长轮询是什么?

    前言 传统的静态配置方式想要修改某个配置时,必须重新启动一次应用,如果是数据库连接串的变更,那可能还容易接受一些,但如果变更的是一些运行时实时感知的配置,如某个功能项的开关,重启应用就显得有点大动干戈 ...

  7. 哈希一致性、哈希取余、自定义轮询分片的比较

    2019独角兽企业重金招聘Python工程师标准>>> 一.自定义轮询分片 按照上图所示,自己写一段逻辑,根据客户端请求循环写入不同Redis服务器 优点: 理解简单 数据分布平均 ...

  8. 还在使用Future轮询获取结果吗?CompletionService快来了解下。

    背景 二胖上次写完参数校验(<二胖写参数校验的坎坷之路>)之后,领导一直不给他安排其他开发任务,就一直让他看看代码熟悉业务.二胖每天上班除了偶尔跟坐在隔壁的前端小姐姐聊聊天,就是看看这些枯 ...

  9. 负载均衡算法-权重轮询均衡

    ②权重轮询均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求.

  10. 负载均衡算法-轮询均衡

    ①轮询均衡( Round Robin):每一次来自网络的请求轮流分配给内部服务器.从1至N然后重新开始.此种均衡算法适合于服务器组中的所有服务器都有相同的软.硬件配置并且平均服务请求量相对均衡的情况.

最新文章

  1. 非x面容解锁插件ios13_ios13近期消息汇总,苹果要放大招??
  2. 李彦宏透露百度真正的护城河
  3. [Ljava.lang.Object; cannot be cast to com.gxuwz.check.entity.SysClasses
  4. unix executable file
  5. 交换机二层交换和三层交换技术比较
  6. SpringMVC-拦截器快速入门
  7. Zabbix监控(十六):分布式监控-Zabbix Proxy
  8. [css] 你对视网膜(Retina)分辨率有了解吗?有没有在实际中使用过?
  9. 2020.2idea怎么创建html项目_如何为IDEA项目创建GitHub存储库和本地Git存储库
  10. win10英文系统一键装机教程
  11. Robocode:下载安装及迁移至IntelliJ
  12. 关于 Uncaught ReferenceError: mOxie is not defined情况下的问题
  13. android 动态壁纸 时钟,Android动态时钟壁纸开发
  14. 初级调色转档CameraRaw
  15. 测试基础+性能测试+自动化测试面试题(含答案)
  16. Revit二次开发之通过命令ID调用Revit自有命令
  17. win7系统下连网络打印机打印反应很慢解决方法
  18. 期末考试:编译原理——如何将控制语句翻译成四元式.
  19. input-file 部分手机不能拍照问题
  20. SAP FICO 基础(1)中日双语

热门文章

  1. AndroidStudio之Git提交代码出现author ‘xxx‘ is not ‘Name ‘ and matches no existing author 的解决方法
  2. html 360登录自动填写,怎么让360安全浏览器记住以前登陆过的帐号和密码,每次都填很麻烦...
  3. 让博客Docker化,轻松上手Docker
  4. LaTeX中的参考文献——作者年代引用
  5. SD卡格式化|SD卡数据恢复技巧
  6. Winform开发框架之通用Windows摄像头调用拍照--SNF快速开发平台3.3-Spring.Net.Framework...
  7. springboot配置mysql
  8. 20220525商汤算法岗实习面试经历
  9. ip经济ip猫:「飞海豚」大圣基因/医修鸽的ValueUP | Chain++
  10. explain ref_面试前一定要知道的MySQL命令【explain】