主题中讨论的其他器件: 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 有何区别? 我的计划的错误(句子或流程)在哪里?
非常感谢!
 
				 
		 
					