新出炉的ADS8028与K60的SPI通信刚刚调试完成!
大概调试了整整五天,也就是一星期。。。。经历了从寄存器配置到逻辑分析,再到用示波器分析调试。虽然很辛苦但是结果还是没有失望哦。大概说下我的调试过程吧
本人是用的是山外的MK60FN的库,库有bug!!倒不是说库写发有什么问题 主要是SPI初始化寄存器的配置,因为山外库历程的教程是基于nrf+做的SPI通信,所以一些配置并不适用于ADS8028,比如说时钟极性CPOL配置,nrf+是空闲时钟低电平,但是ADS8028空闲时是高电平。
ADS8028的配置
ADS8028的数据手册基本上百度都有,但是!!!找不到中文手册。所以我就简单的把一些重要的东西在这总结一下。本人也是英语渣渣,所以往大家海涵啊,保证正确度,但表述可能不是很精炼哈。
ADS8028 是一款 12 位模数转换器 (ADC),此转换器采样速度高达 1MSPS, 八通道。模拟电源 (AVDD):2.7V 至 5.25V;数字电源 (DVDD):1.65V 至 5.25V;模拟通道输入电压值 –0.3 to AVDD + 0.3 。时钟极性CPOL—1(无效时,SCK为高电平),时钟相位CPHA—0(前沿采样)。
接下来说一说关于ADS与K60的通信吧
我用的是山外的库,主要用来两个函数,一个是SPI初始化,一个是SPI接受和发送函数,关于SPI通信的原理就不扯了,百度随便搜一下就能搜出来,而且很详细。
我们主要说一下SPI的配置吧,我是把K60当做主机配置,配置是10M的波特率,ADS8028的最高频率是20M,所以10~15M的波特率都是比较合适的。
其实初始化里面的配置主要是关于时钟极性和时钟相位的配置,还有就是此接受和发送都必须设为高字节数据先输入输出,基本上初始化底层的东西就这么多。
ADS8028中我们只需要用到两个寄存器,一个读数据,一个发送指令,发送指令到达CR寄存器中,CR寄存器是十六位的,我简单做如下介绍:
bit15 WRITE:写操作使能
0是进行进行写操作,1是使能写操作,如果置0,那么后面所 有的寄存器的位操作都将无效
所以如果进行写操作,此位必须置1
bit14 REPEAT:此位表示下一个循环的命令和此命令相同
1是代表使能这项应用,一般置1,因为每次读取的通道是一致的
bit【13:6】:模拟输入通道的选择,一共是8个通道,AIN7-AIN0,1表示选择此通道,0则反之亦然。
bit5 内部温度传感器的选择,高电平有效
bit【4:3】 这两位可以忽视
bit2 表示是否使用外置参考电压,1有效
bit1 也是关于内部温度传感器的操作,因为我没有到此温度传感器,所以直接置0
bit0 待机模式 1有有效
好了,以上就是关于CR寄存器的参考了,我是用的是山外库里面的发送接收函数。
注意!请注意!
在接受和发送时,由于是16位寄存器的操作,所以发送和接受都是两个字节,它的发送时一个字节一个字节发送,相当于它把你16位的数据看成一个数组,这个数组有两个u8的数据,它先发数组0,再发数组1,但是我们的ADS接受会默认你是高位在前低位数据在后,所以呢,你发送的数据和ADS接受到的数据并不一样。我知道你没听懂,所以用一个例子说下吧
**
**比如我想发送的是0XFF04到CR寄存器里面,但是如果调用山外库里面的接受发送函数的话,它对这个值做的是这样的操作,将0XFF04看成一个数组data,
data【0】=04,data【1】=FF;然后进行发送,还记得吗?所以发送时先进行数组data[0] ,再发送data[1],所以ADS8028接受的数据是04FF。所以你想接受到的数据是0XFF,发送时应设置为0X04FF。接受数据同理。
接下来聊一聊接受的数据吧。
接受的数据也是十六位的,bit[0:11]是模拟输出,bit【12:15】是输出数据对应的模拟通道号。
最后我们再聊一聊调试吧,一开始我用的是逻辑分析仪进行的分析,嗯,很傻逼,因为使用的硬件SPI,所以其实根本用不着逻辑分析仪,反而因为我的频率太快,导致分析出来的时钟是乱的,但是当我使用1M的时候这个时候逻辑分析仪可以使用了,最好还是用示波器做测试吧。