工具/软件:Code Composer Studio
大家好、我使用以下代码在主从之间使用 SSI 接口发送和接收数据、我的目标是从主从发送一些值、从返回该值乘以某个数字。
以下代码的问题是从机可以接收值"ui32Message" 、即800、但 Value Master 接收到"ui32MessageX"、但它保持为零。此外、当我在 一个控制器中使用 SSIDataGet (SSI0_BASE、&ui32Message)接收数据而不为另一个控制器供电时、也会出现另一个问题(仅其他控制器未连接)、 程序在下一个状态上卡滞、除非我将其连接到其他控制器(为另一个控制器供电)、否则不会执行该程序。
//从
器件#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/secl.idio"
#include "drivers.idio.h"#include "drivers/drivers.mdio.ide"#include "#include "#drivers.idio"#include "#include "drivers.idio.idio.h"
*配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。 *
* /void
ConfigureUART (void)
{
//启用 UART 使用的 GPIO 外设。
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//启用 UART0
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//为 UART 模式配置 GPIO 引脚。
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
//使用内部16MHz 振荡器作为 UART 时钟源。
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
//初始化控制台 I/O 的 UART
UARTStdioConfig (0、115200、16000000);
}
/*********
*主函数、程序入口点。 *
(S)** /
int main (void)
{
uint32_t ui32Message = 0;
uint32_t ui32MessageX = 0;
//将 PLL 的时钟设置为以50MHz 运行。
SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz |
SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0RX);
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);
SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_SLAVE、10000、 16);
SSIEnable (SSI0_BASE);
//初始化 UART 并对其进行配置
ConfigureUART();
UARTprintf ("\n ** \n* SSI 从机日志*\n****** \n");
while (1)
{
UARTprintf ("\n ui32Message \n");
SSIDataGet (SSI0_BASE、\ui32Message);
UARTprintf ("%d"、ui32Message);
UARTprintf ("\n 收到的 ui32消息\n");
SysCtlDelay (SysCtlClockGet ()/100);
while (SSIBusy (SSI0_BASE));
ui32MessageX=ui32Message+2;
UARTprintf ("%d"、mx);
SSIDataPut (SSI0_BASE、ui32MessageX);
while (SSIBusy (SSI0_BASE));
UARTprintf ("\---- ui32MessageX 已发送--- \n");
}
}
//主
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/secl.idio"
#include "drivers.idio.h"#include "drivers/drivers.mdio.ide"#include "#include "#drivers.idio"#include "#include "drivers.idio.idio.h"
*配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。 *
* /void
ConfigureUART (void)
{
//启用 UART 使用的 GPIO 外设。
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//启用 UART0
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//为 UART 模式配置 GPIO 引脚。
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
//使用内部16MHz 振荡器作为 UART 时钟源。
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
//初始化控制台 I/O 的 UART
UARTStdioConfig (0、115200、16000000);
}
uint32_t ui32Message = 0;
unit32_t ui32MessageX= 0;
int main (void)
{
//将 PLL 的时钟设置为以50MHz 运行。
SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz |
SYSCTL_OSC_MAIN);
// HWREG (GPIO_PORTF_BASE + GPIO_LOCK)= GPIO_LOCK_KEY;
// HWREG (GPIO_PORTF_BASE + GPIO_O_CR)= 0xFF;
//
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA5_SSI0TX);
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_3 | GPIO_PIN_2);
SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、10000、 16);
SSIEnable (SSI0_BASE);
//初始化 UART 并对其进行配置
ConfigureUART();
UARTprintf ("\n ** \n* SSI 主日志*\n****** \n");
while (1)
{
ui32Message = 800;
SSIDataPut (SSI0_BASE、ui32Message);
while (SSIBusy (SSI0_BASE));
UARTprintf ("\ui32Message sent \n");
SysCtlDelay (SysCtlClockGet ()/100);
SSIDataGet (SSI0_BASE、\ui32MessageX);
UARTprintf ("%d"、ui32MessageX);
UARTprintf ("\n 接收到的 ui32消息\n"\});
while (SSIBusy (SSI0_BASE));
}
}