主题中讨论的其他器件:ADC161S626EVM、 Strike
工具/软件:Code Composer Studio
我使用 SSI 将 EK-TM4C94XL 与 ADC161S626EVM Booster Pack 进行通信。
调试我的代码时、我看到它在 SSIDataGet 的部分中停止(...)。 单步执行此函数时、它停止的部分如下所示:
//等待直至有数据要读取。
//
while (!(HWREG (ui32Base + SSI_O_SR)& SSI_SR_RNE))
{
}
以下是代码:
#include
#include
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/ssi.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "inc/hw_types.h"
uint32_t ui32SysClkFreq;
无效
UARTPrompt (uint32_t str[])
{
uint8_t i = 0;
while (str[i]!='\0'){
UARTCharPut (UART0_BASE、str[i]);
i++;
}
}
无效
InitPORTE (空)
{
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE))
{
}
GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_4);
GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、1);
}
无效
InitConsole (空)
{
//
//启用 UART0以便我们可以配置时钟。
//
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//
//启用用于 UART0引脚的 GPIO 端口 A。
// TODO:将其更改为您正在使用的 GPIO 端口。
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//
//为端口 A0和 A1上的 UART0功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
//
//为这些引脚选择替代(UART)功能。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
//
//使用内部16MHz 振荡器作为 UART 时钟源。
//
//UARTClockSourceSet (UART0_BASE、UART_CLOCK _PIOSC);
//
//初始化控制台 I/O 的 UART
//
UARTConfigSetExpClk (UART0_BASE、ui32SysClkFreq、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
}
内部
main (空)
{
uint32_t pui32DataRx[3];
uint32_t ADCRx[16];
uint8_t i;
//
//将时钟设置为直接从外部晶振/振荡器运行。
// TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
板上的//晶体。
//
ui32SysClkFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
//
//设置用于显示消息的串行控制台。 这是
//仅用于此示例程序,SSI 操作不需要。
//
InitConsole();
InitPORTE();
SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
GPIOPinConfigure (GPIO_PD3_SSI2CLK);
GPIOPinConfigure (GPIO_PD2_SSI2FSS);
GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 |
GPIO_PIN_3);
SSIConfigSetExpClk (SSI2_base、ui32SysClkFreq、SSI_FRF_MOTO_MOTO_MODE_1、
SSI_MODE_MASTER、1000000、8);
HWREG (SSI2_base + 0x004)= 0x00000001;
SSIEnable (SSI2_base);
//
//从 SSI 端口读取任何残留数据。 这将确保接收
// FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成
//因为 SPI SSI 模式为全双工模式,允许您发送和
//同时接收。 SSIDataGetNonBlocking 函数返回
//返回数据时为"true",未返回数据时为"false"。
//“非阻塞”函数检查接收中是否有数据
// FIFO、如果没有、则不会"挂起"。
//
while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0]))
{
}
GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、0);
UARTCharPut (UART0_BASE、"T");
UARTCharPut (UART0_BASE、'\n');
for (i=0;i<16;i++){
SSIDataGet (SSI2_base、&ADCRx[i]);
}
UARTPrompt (ADCRx);
返回(0);
}