This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123GH6PM与MAX6675的SPI通信问题

Other Parts Discussed in Thread: TM4C123GH6PM

程序总是卡死在“SSIDataGet(SSI0_BASE, &temp[i]);”这里。

#include <stdbool.h>
#include <stdint.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_gpio.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_uart.h"
#include "driverlib/ssi.h"
#include "driverlib/uart.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"

uint32_t i = 0;
uint32_t temp[16]={0};

void main()
{
unsigned long i = 0;

// 运行在40MHz 模式下
SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

//配置串口通信
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));

// 使能 SSI0模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);

// 配置相关引脚
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA3_SSI0FSS);
GPIOPinConfigure(GPIO_PA4_SSI0RX);
GPIOPinConfigure(GPIO_PA5_SSI0TX);

// 配置管脚相应的类型
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |GPIO_PIN_2);

// 设置 SSI 协议、工作模式、位速率和数据宽度
// SSI0_BASE - 使用 SSI0
// SysCtlClockGet() - 提供到 SSI0的时钟速率
// SSI_FRF_MOTO_MODE_0 - 数据传输协议,极性: 1,相位: 1
// SSI_MODE_SLAVE - 模式选择:配置为从机模式
// 1000000 - 设定 SSI模块位速率为 1M
// 8 - 8 位数据宽度
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_3,SSI_MODE_SLAVE, 1000000, 8);

// 使能 SSI模块
SSIEnable(SSI0_BASE);

// 清除缓冲区的数据,确保读到的数据时正确的。
while(SSIDataGetNonBlocking(SSI0_BASE, &temp[0]));

// 进入死循环
while(1)
{
// 接收数据
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, ~GPIO_PIN_3); //把片选拉低
for(i = 0;i < 16; i++)
{
SSIDataGet(SSI0_BASE, &temp[i]);
UARTCharPut(UART0_BASE,temp[i]);
}
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); //把片选拉高

UARTCharPut(UART0_BASE,'\n');

// 清除缓冲区的数据,确保读到的数据时正确的。
while(SSIDataGetNonBlocking(SSI0_BASE, &temp[0]));
}
}