TI论坛
直播中

陈龙

7年用户 179经验值
私信 关注
[问答]

TM4C123GH6PM与MAX6675的SPI通信程序总是卡死在“SSIDataGet(SSI0_BASE, &temp);”这里

程序总是卡死在“SSIDataGet(SSI0_BASE, &temp);”这里。
#include
#include
#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);
UARTCharPut(UART0_BASE,temp);
]
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); //把片选拉高
UARTCharPut(UART0_BASE,'n');
// 清除缓冲区的数据,确保读到的数据时正确的。
while(SSIDataGetNonBlocking(SSI0_BASE, &temp[0]));
]
]

回帖(8)

韦明

2018-8-15 06:49:39
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

陈龙

2018-8-15 07:01:38
引用: ljmlvmd 发表于 2018-8-15 06:49
SSIDataGet(SSI0_BASE, &temp);
一直等待数据的接收,你max6675没有数据发出来,就退不出来了。还是没通上。

请问应该怎么改呢?难道是我的硬件没有接好吗?
QQ:2454008481
举报

韦明

2018-8-15 07:08:37
引用: qa110 发表于 2018-8-15 07:01
请问应该怎么改呢?难道是我的硬件没有接好吗?
QQ:2454008481

抓波形把,先确保你的波形和数据手册的一样,发出去命令,接收线上就肯定有数据了。
举报

陈龙

2018-8-15 07:23:30
引用: ljmlvmd 发表于 2018-8-15 07:08
抓波形把,先确保你的波形和数据手册的一样,发出去命令,接收线上就肯定有数据了。

h好像我只需要读取就可以了,并不需要发送什么数据。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分