工具/软件:Code Composer Studio
我的任务是以4kHz 的频率读取 AD4001 ADC (模拟器件)。 我似乎正在从 ADC 读取数据、但它不可靠。 是否有人对此器件有经验?
我将 TM4C123G Launchpad 连接到 ADC:
SSIOTX 为 NC
SSIORX 连接到 SDO 引脚
SSIOCLK 连接到 SCK 时钟引脚。
我使用 GPIO 来控制 CNV 引脚。
ADC 上的 SDI 被拉高至 VIO。
我正在查看示波器上的 SPI、在某些情况下、在时钟开始前线路上有数据?
以下是代码片段:
(初始化)
void SpiInit_SSI0 (void){
//必须启用 SSI0外设才能使用。
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
//对于 TM4C123G、SSI0与 Porta[5:2]一起使用。
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。
GPIOPinConfigure (GPIO_PA2_SSI0CLK);//为时钟配置 PA2
// GPIOPinConfigure (GPIO_PA3_SSI0FSS);//将 GPIO 用于*CS 函数。
GPIOPinConfigure (GPIO_PA4_SSI0RX);//为主机接收配置 PA4
GPIOPinConfigure (GPIO_PA5_SSI0TX);//为主机发送配置 PA5
GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_3);//将 PA3配置为* CS 的 GPIO
//配置 SSI 引脚的 GPIO 设置。 该函数也会提供
将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表
//查看每个引脚分配的函数。
//引脚分配如下:
// PA5 - SSI0Tx
// PA4 - SSI0Rx
// PA3 - SSI0Fss -未使用
// PA2 - SSI0CLK
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_2);
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、0);//为*CS 启用 GPIO 引脚
//为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI0、
//系统时钟电源,空闲时钟低电平和低电平有效时钟输入
//飞思卡尔 SPI 模式、主控模式、1MHz SSI 频率和8位数据。
//对于 SPI 模式,可以设置 SSI 时钟的极性
//单元空闲。 您还可以配置所需的时钟边沿
//在上捕获数据。 有关的更多信息、请参阅数据表
//不同的 SPI 模式。
SSIConfigSetExpClk (SSI0_BASE、8000000、SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、20000000、16);
//启用 SSI0模块。
SSIEnable (SSI0_BASE);
uint32_t pui32DataRx[2];
//从 SSI 端口读取任何当前数据。 这将确保接收
// FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成
//因为 SPI SSI 模式为全双工模式,允许您发送和
//同时接收。 SSIDataGetNonBlocking 函数返回
//返回数据时为"true",未返回数据时为"false"。
//“非阻塞”函数检查接收中是否有数据
// FIFO、如果没有、则不会"挂起"。
while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0])){}
}
GPIO_PORta_data_R |= 0xFF;
SysCtlDelay (4);
GPIO_Porta_DATA_R &= 0xF7;
SSIDataPut (argSsiBase、0x1400);//0x1406);//pui32DataTx[ui32Index]);
//等待 SSI0完成传输发送 FIFO 中的所有数据。
// while (SSIBusy (argSsiBase)){}
uint32_t data = 0xCCCCCCCCCC;
SSIDataGet (argSsiBase、&data);
// while (SSIBusy (argSsiBase)){}
返回 convertToVoltage ((int16_t)(data & 0xFFFF));