您的位置:首页 > 其它

操作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的操作的关键就在时序这里,切忌,希望以后能不要再走弯路。

附:最终代码:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐