操作ADS7961时遇到的一个问题

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










你可能感兴趣的:(操作ADS7961时遇到的一个问题)