操作ADS7961时遇到的一个问题
2011-10-12 19:59
393 查看
操作ADS7961时遇到的一个问题
ADS7961是TI的ADS79XX家族中的一个,是16通道8位的SPI接口的ADC。对于嵌入式应用软件人员来说,完成正确的ADS7961操作,主要是完成SPI的操作,由于此处CPU是OMAPL138,步骤主要两步:初始化SPI和SPI发控制信息给ADS7961。
在调试中,令人郁闷的是,cpu控制器这边已正确的发出数据(CLK、MOSI、CS用示波器看过),但7961这边回的的数据就是0xFF,或者是一些没规律的数据,回头翻阅7961Datasheet几遍,确认自己操作的“Manual Mode”步骤没有错误,且发送的“Mode Control Register Settings”数据也是没有错误的,然后再回头翻阅TI的omapl138的SPI手册也确认了SPI的初始化和发送函数也没有令人很大怀疑的地方,此时快要崩溃(甚至怀疑7961是不是坏了,也去重新确认了一遍SPI的SCLK的频率),也不知是啥时候突然看到了SPI的polarity和phase参数,于是仔细查看对比7961和138SPI的时序图,才最终得到解决(polarity应为0,phase应为1,也就是控制器这边发出SCLK是上升沿锁住输入,下降沿输出数据)。
不过还有一个地方不明白,在给7961的每帧数据中,要重新初始化SPI,否则收到的7961认为不是下一帧,导致SPI收到的是0xFF。
此次7961的操作的关键就在时序这里,切忌,希望以后能不要再走弯路。
附:最终代码:
ADS7961是TI的ADS79XX家族中的一个,是16通道8位的SPI接口的ADC。对于嵌入式应用软件人员来说,完成正确的ADS7961操作,主要是完成SPI的操作,由于此处CPU是OMAPL138,步骤主要两步:初始化SPI和SPI发控制信息给ADS7961。
在调试中,令人郁闷的是,cpu控制器这边已正确的发出数据(CLK、MOSI、CS用示波器看过),但7961这边回的的数据就是0xFF,或者是一些没规律的数据,回头翻阅7961Datasheet几遍,确认自己操作的“Manual Mode”步骤没有错误,且发送的“Mode Control Register Settings”数据也是没有错误的,然后再回头翻阅TI的omapl138的SPI手册也确认了SPI的初始化和发送函数也没有令人很大怀疑的地方,此时快要崩溃(甚至怀疑7961是不是坏了,也去重新确认了一遍SPI的SCLK的频率),也不知是啥时候突然看到了SPI的polarity和phase参数,于是仔细查看对比7961和138SPI的时序图,才最终得到解决(polarity应为0,phase应为1,也就是控制器这边发出SCLK是上升沿锁住输入,下降沿输出数据)。
不过还有一个地方不明白,在给7961的每帧数据中,要重新初始化SPI,否则收到的7961认为不是下一帧,导致SPI收到的是0xFF。
此次7961的操作的关键就在时序这里,切忌,希望以后能不要再走弯路。
附:最终代码:
uint32_t CBoard::ReadVotage(uint32_t channel) { spi_config_t spi_config; spi_config.mode = SPI_MODE_MASTER; spi_config.pin_option = SPI_4PIN_CS; spi_config.cs_active = SPI_CS_ACTIVE_LOW; spi_config.shift_dir = SPI_SHIFT_MSB; spi_config.polarity = 0; spi_config.phase = 1; spi_config.freq = 2000000; spi_config.chip_number_select = H_SPI1_AD_CSn; uint8_t sendBuf[2]; uint8_t recvBuf[2]; recvBuf[0] = 0x00; recvBuf[1] = 0x00; sendBuf[0] = (3 << 3) | ((channel & 0x0f) >> 1); sendBuf[1] = (channel & 0x01) << 7; CTimer outtime; SPI_init(SPI1,&spi_config); outtime.DelayUs(100); SPI_xfer(SPI1,sendBuf,recvBuf,2,SPI_HOLD_CLR); SPI_init(SPI1,&spi_config); //要重新初始化SPI1,不然下面收到的是0xFF,目前不知道是什么原因 outtime.DelayUs(100); SPI_xfer(SPI1,sendBuf,recvBuf,2,SPI_HOLD_CLR); SPI_init(SPI1,&spi_config); outtime.DelayUs(100); SPI_xfer(SPI1,sendBuf,recvBuf,2,SPI_HOLD_CLR);//第三次才是需要的数据 uint32_t voltage; voltage = ((recvBuf[0] & 0x0f) << 4) | ((recvBuf[1] & 0xf0) >> 4); voltage = voltage/256.0*2.5*1000*11; return voltage; }
相关文章推荐
- 表空间实际操作遇到的一个问题
- 引用一个项目作为library的操作步骤---开发中遇到的问题(二)
- 引用一个项目作为library的操作步骤---开发中遇到的问题(二)
- 分页操作时候遇到的一个问题
- C# 操作数据导出到Excel遇到的一个小问题
- 最近写一个C#关于U盘的操作,在弹出U盘是遇到了些问题,C#调WINdoWs底层的东西太麻烦了,看样子要看看VC或C了
- C# 操作数据导出到Excel遇到的一个小问题
- 对于一个小白来说,遇到的前端问题(2)
- C语言中对大文件操作遇到的问题
- 关于扩展listView中遇到的一个小问题
- WORD中经常遇到的一个图片插入问题
- nginx反向代理tomcat时遇到一个问题
- 在一个开源项目的开发中遇到的问题
- 初接触ContentService遇到的一个问题
- (二十三)IDEA 构建一个springboot工程,以及可能遇到的问题
- Android环境下接收系统灭屏广播遇到延时问题的一个解决方法
- 网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求
- RTMP握手中遇到的一个问题
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题(非原创,摘自书中)
- 今天工作需要调用一个c++程序,以给那个程序发送请求的方式,遇到了跨域问题