主题中讨论的其他器件:ADS114S08、 ADS114S08B、 ADS124S08
工具/软件:Code Composer Studio
我使用板载 J3通过 SPI 与 ADS114S08进行通信。 我使用的外部处理器是 Tiva TM4C129NCPD。 我使用电路板的 RTD (3线制一)通道,并在 AN1-AN2之间连接了一个电阻器。
首先、我初始化了 SSI0模块执行 InitSSI 函数、如下所示:
空 InitSSI (空)
{
uint32_t extra;
SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、SYS_CLK_FREQ);
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);// SSI 模块0时钟
GPIOPinConfigure (GPIO_PA3_SSI0FSS);// SSI 模块0帧信号
GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);// SSI 模块0双向数据管脚0 (传统 SSI 模式下的 SSI0TX)。
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);// SSI 模块0双向数据管脚1 (传统 SSI 模式下的 SSI0RX)。
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);
SSIConfigSetExpClk (SSI0_BASE、SYS_CLK_FREQ、SSI_FRF_MOTO_MOTO_1、SSI_MODE_MASTER、10000000、 8);
SSIEnable (SSI0_BASE);
while (SSIDataGetNonBlocking (SSI0_BASE、&extra)){}
}
使用上述设置、我 成功地将数据发送到 ADS114S08。 为了初始化 ADS114S08、我执行了 Init_ADS114S08_RTD 函数、如下所示:
//*********
// ADS114S08B 定义
//*********
#define RTD_START_COMMAND 0x08 // SPI 数据以在 ADS114S08中启动新转换
#define RTD_CH1_INPUTMUX 0x12 // SPI 数据、分别将 AIN1和 AIN2设置为正输入和负输入选择。
#define RTD_CH1_IDACMUX 0x35 // SPI 数据、分别将 AIN5和 AIN3设置为 IDAC1和 IDAC2的激励电流。
#define RTD_IDACMAG 0x07 // SPI 数据将 IDAC 幅度设置为1mA。
#define RTD_PGA 0x0A // SPI 数据将 PGA 设置为4。
//#define RTD_datarate 0x3B // SPI 数据将时钟源设置为内部(4.096MHz)、转换更多设置为单次触发、数据速率设置为1000SPS
#define RTD_datarate 0x14 // SPI 数据将时钟源设置为内部(4.096MHz)、转换更多设置为单次触发、数据速率设置为1000SPS
#define RTD_REF 0x06 // SPI 数据、用于启用正缓冲器和禁用负缓冲器、以及将 REFP1-REFN1设置为基准输入。
#define RTD_RDATA_COMMAND 0x12 // RDATA 命令可读取转换数据
#define RTD_WREG_COMMAND1 0x42 // WREG 命令、以从 INPMUX 开始写入6个器件寄存器数据
#define RTD_WREG_COMMAND2 0x05
空 Init_ADS114S08_RTD (空)
{
//
//局部变量
//
uint32_t dataRx;
//
//使用"阻塞" Put 函数发送 N 位数据(N = 16位、SSI 配置为 SSIConfigSetExpClk 函数)。
//此函数将等到发送 FIFO 中有空间后再返回。
//这使您可以确保发送的所有数据都将其放入发送 FIFO 中。
//
SSIDataPut (SSI0_BASE、0x42);
SSIDataPut (SSI0_BASE、0x05);
SSIDataPut (SSI0_BASE、RTD_CH1_INPUTMUX);
SSIDataPut (SSI0_BASE、RTD_PGA);
SSIDataPut (SSI0_BASE、RTD_datarate);
SSIDataPut (SSI0_BASE、RTD_REF);
SSIDataPut (SSI0_BASE、RTD_IDACMAG);
SSIDataPut (SSI0_BASE、RTD_CH1_IDACMUX);
while (SSIBusy (SSI0_BASE)){}//等待 SSI0完成传输发送 FIFO 中的所有数据。
//清空接收 FIFO 中的垃圾数据
SSIDataGet (SSI0_BASE、&dataRx);
SSIDataGet (SSI0_BASE、&dataRx);
SSIDataPut (SSI0_BASE、RTD_START_COMMAND);//开始初始转换
while (SSIBusy (SSI0_BASE)){}
//清空接收 FIFO 中的垃圾数据
SSIDataGet (SSI0_BASE、&dataRx);
}
下图来自我们的逻辑分析仪。 尽管主器件发送数据、但从器件始终发送0x00、这一点很清楚。 嗯、最初我以为这是垃圾数据、所以我可以忽略它、因为我知道我应该一直清空接收 FIFO。 为此、我执行 了两次 SSIDataGet、因为上面可以看到它已清空接收 FIFO (注意:在这里、我假设 SSIDataGet 函数通过读取32位来清空两个 FIFO、 如果我错了、则可以对我进行校正)。 但是、当我仅执行第一个时、函数开始等待。 嗯、如果接收 FIFO 为空、我们就会这样期望、这样我就检查了 SSI_SR_RNE 寄存 器、并意识到即使在执行 SSIDataPut 八次之后、它仍然保持为零。 它听起来接收 FIFO 没有从从器件获取任何数据。
嗯、我忽略了这一点、并在主循环中执行了以下部分来从从器件读取数据:
SSIDataPut (SSI0_BASE、Dummy_word);
SSIDataPut (SSI0_BASE、RTD_RDATA_COMMAND);// SPI (RTD_RDATA_COMMAND)数据、从 ADS114S08请求 AIN1 - AIN2值
SSIDataPut (SSI0_BASE、Dummy_word);
SSIDataPut (SSI0_BASE、Dummy_word);
while (SSIBusy (SSI0_BASE)){}//等待 SSI0完成传输发送 FIFO 中的所有数据。
SSIDataGet (SSI0_BASE、&dataRx);
结果= dataRx 和0xFFFF;//捕获第二次读取后的最低有效16位数据。
我执行了四次 SSIDataPut、希望最后一次接收 FIFO 寄存器将具有有效数据、以便我可以轻松读取。 在评估读取数据后、我执行以下部分以进行下一次读取
//开始转换以进行下一次读数
SSIDataPut (SSI0_BASE、RTD_START_COMMAND);
while (SSIBusy (SSI0_BASE)){}
SSIDataGet (SSI0_BASE、&dataRx);//忽略结果
可以看到、最后16位始终为零、这对我来说是没有意义的。 我还附加了我的设置图片。 对此问题有任何建议吗? 提前感谢...