操作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;
}