主题中讨论的其他器件: ADS131A04
您好!
我一直在调试一个程序。它还不起作用。
CPU 为 TM4C129XNCZAD、ADC 为 ADS131A04 (每通道24位、32kbps)、它们与 SSI1信号引脚链接、CLK、DI 和 DOUT 通常被初始化、CS 引脚被配置为 GPIO 输入引脚、并链接至 ADS131A04的 RDY 除外。 该方案如下:
GPIOPinConfigure (GPIO_PB5_SSI1CLK);// Clk
//GPIOPinConfigure (GPIO_PB4_SSI1FSS);// CS
GPIOPinConfigure (GPIO_PE5_SSI1XDAT1);// Rx
GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);// Tx
GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_5/*| GPIO_PIN_4*/);
GPIOPinTypeSSI (GPIO_Porte _BASE、GPIO_PIN_4 | GPIO_PIN_5);
// SSI1 CS
GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_4);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、GPIO_PIN_4);
SSI1的初始化为:
//
//必须启用 SSI1外设才能使用。
//
SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
//
//将 SSI 外设的数据时钟源设置为 SYSCLK
//
SSIClockSourceSet (SSI1_base、SSI_Cock_SYSTEM);
//
//为 SPI 主控模式配置和启用 SSI 端口。
//
SSIConfigSetExpClk (SSI1_base、/*16384000*/g_ui32SysClock、SSI_FRF_MOTO_MODE_1、
SSI_MODE_MASTER、15360000/*15360000*/、8);
//
//启用 SSI1模块。
//
SSIEnable (SSI1_base);
然后、我通过向 ADS131A04发送相应的 cmds 来初始化 ADS131A04 、如下所示:
ads131A04SendCmd (ADS131A04_UNCH_COMMAND);
ads131A04SendCmd (WRITE_REGISTER_COMMAND (CLK1、CLK_DIV_2));
ads131A04SendCmd (WRITE_REGISTER_COMMAND (ADC_ENA、ADC_ENA_ENABLE_ALL_CHANNEL_CHINESS_ALL_CHANNELS));
在唤醒 ADS131A04之前、我按如下方式设置 uDMA 参数:
//将通道分配给 SSI1
//
uDMAChannelAssign (UDMA_CHANGE_SSI1RX);
uDMAChannelAssign (UDMA_CHANGE_SSI1TX);
//
//设置 uDMA TX
//
//
//将 uDMA SSI1 TX 通道的属性置于已知状态。 这些
默认情况下、//应已禁用。
//
uDMAChannelAttributeDisable (UDMA_CHANGE_SSI1TX、
UDMA_ATTR_USEBURST |
UDMA_ATTR_ALTSELECT |
//uDMA_attr_high_priority |
UDMA_ATTR_REQMASK);
//
//设置 uDMA SSI1 TX 通道的 USEBURST 属性。 这将会
//强制控制器在传输数据时始终使用突发
//将 TX 缓冲器连接到 UART。 这是比较有效的总线使用
//不是允许单次或突发传输的默认值。
//
uDMAChannelAttributeEnable (UDMA_CHANGE_SSI1TX、/* UDMA_ATTR_USEBURST |*/ UDMA_ATTR_HIGH_PRIORY);
//
//配置 SSI1 TX 的控制参数。 UDMA SSI1 TX
//通道用于将数据块从缓冲区传输到 SSI1。
//数据大小为8位。 源地址增量为8位字节
//因为数据来自缓冲区。 目的增量为
//由于数据将被写入 SSI1数据寄存器,因此不存在。 。
//仲裁数目设置为1,与 SSI1 TX FIFO 触发值匹配
//阈值。
//
uDMAChannelControlSet (UDMA_CHANGE_SSI1TX | UDMA_PRI_SELECT、
UDMA_SIZE_8 |
UDMA_SRC_INC_8 |
UDMA_DST_INC_NONE |
UDMA_ARB_1);
//
//设置 uDMA RX
//
//
//将 UDMA SSI1 RX 通道的属性置于已知状态。 这些
默认情况下、//应已禁用。
//
uDMAChannelAttributeDisable (UDMA_CHANGE_SSI1RX、
UDMA_ATTR_USEBURST |
UDMA_ATTR_ALTSELECT |
//uDMA_attr_high_priority |
UDMA_ATTR_REQMASK);
//
//设置 UDMA SSI1 RX 通道的 USEBURST 属性。 这将会
//强制控制器在传输数据时始终使用突发
//将 TX 缓冲器连接到 SSI1。 这是比较有效的总线使用
//不是允许单次或突发传输的默认值。
//
uDMAChannelAttributeEnable (UDMA_CHANGE_SSI1RX、/* UDMA_ATTR_USEBURST |*/ UDMA_ATTR_HIGH_PRIORY);
//
//配置 SSI1 RX 的控制参数。 UDMA RX
//通道用于将数据块从 SSI1传输到缓冲区。
//数据大小为8位。 源地址增量为 none
//因为数据来自 SSI1。 目的增量为
//由于数据来自 SSI1数据寄存器。 。
//仲裁大小设置为1,与 UART TX FIFO 触发器匹配
//阈值。
//
uDMAChannelControlSet (UDMA_CHANGE_SSI1RX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_NONE |
UDMA_DST_INC_8 |
UDMA_ARB_1);
在 ADS131A04 RDY 的 IntHander 常规中:
//清除整型标志
GPIOIntClear (PORT_ADS131A04_DRDY、GPIOINTFLAG_ADS131A04_DRDY);
//启用 INT
GPIOIntEnable (PORT_ADS131A04_DRDY、GPIOINTFLAG_ADS131A04_DRDY);
//设置 uDMA SSI1 RX 通道的传输参数。 这将会
//配置传输源和目的以及传输大小。
//使用基本模式是因为外设正在进行 UDMA 传输
//请求。 源是 SSI1数据寄存器和目的
//是 RX 缓冲器。
//
uDMAChannelTransferSet (UDMA_CHANGE_SSI1RX | UDMA_PRI_SELECT、
UDMA_MODE_AUTO、gui8SSI1RxDMABufA、
(void *)(SSI1_base + SSI_O_DR)、
15/*sizeof (gui8SSI1TxDMABuf)*/;
//
//设置 uDMA SSI1 TX 通道的传输参数。 这将会
//配置传输源和目的以及传输大小。
//使用基本模式是因为外设正在进行 UDMA 传输
//请求。 源是 TX 缓冲区、目的是 SSI1
//数据寄存器。
//
uDMAChannelTransferSet (UDMA_CHANGE_SSI1TX | UDMA_PRI_SELECT、
UDMA_MODE_AUTO、gui8SSI1TxDMABuf、
(void *)(SSI1_base + SSI_O_DR)、
15/*sizeof (gui8SSI1TxDMABuf)*/;
//
//必须重新启用 uDMA TX 通道。
//
uDMAChannelEnable (UDMA_CHANGE_SSI1TX);
uDMAChannelEnable (UDMA_CHANGE_SSI1RX);
//
//启用 SSI1 DMA TX/RX 中断。
//
SSIDMAEnable (SSI1_BASE、SSI_DMA_RX | SSI_DMA_TX);
SSIIntEnable (SSI1_BASE、SSI_DMARX | SSI_DMATX);
//
//请求 uDMA 通道启动传输。
//
uDMAChannelRequest (UDMA_CHANGE_SSI1TX);
uDMAChannelRequest (UDMA_CHANGE_SSI1RX);
//
//将 ADS131A04的 CS 信号置为有效
//
ADS131A04_CS_ENABLE;
但是、SSI1和 UDMA 无法正常工作。 事实是:输入的 ADS131A04 RDY IntHandler 和 SSI1 IntHandler 的数量是对的(32K)、但 AD 样本数据全部为0! 在示波器上、CLK 的频率小于156KB、这显然是错误的。 正确的 CLK 频率可能是32 x 24 x 5=3840Kb。
因此、我想知道我的程序的问题。 正常模式和 DMA 模式之间的 SSI1 CLK 有何区别? 我的计划的错误(句子或流程)在哪里?
非常感谢!