引用: Emily1225 发表于 2019-8-28 14:38
例程如下,该例程在同一块芯片上使用SSI0模块为主,SSI1模块为从,一个发送一个接收,需要外部连接两个SSI模块的对应引脚。
这其实和2块板子通信原理完全一样。另外附件中还有另外3个例程也可以一并同时参考。
外部引脚连接:
对应程序:
//*****************************************************************************
//
// 设定 SSI0 为SPI主模式,SSI1 为SPI从模式
// SSI0,发送8位数据,SSI1接收
//
//*****************************************************************************
int
main(void)
[
unsigned long ulDataTx[NUM_SSI_DATA];
unsigned long ulDataRx[NUM_SSI_DATA];
unsigned long ulindex;
//必须写入0xA5A5A5A5,之后才能够改写一些被MWRALLOW保护的寄存器
HWREG(SYSCTL_MWRALLOW) = 0xA5A5A5A5;
// 设定 PLL,Fout=300M,M3 running at 75MHz and C28 running at 150MHz
SysCtlClockConfigSet(SYSCTL_SYSDIV_1 | SYSCTL_M3SSDIV_2 | SYSCTL_USE_PLL |
(SYSCTL_SPLLIMULT_M & 0x0F));
// 该子程序用于设定串口,调试时可以看到串口输出
// 设定PE4,PE5为SCI功能,115200的速度
InitConsole();
// UART输出
UARTprintf("SSI ->n");
UARTprintf(" Mode: SPIn");
UARTprintf(" Data: 8-bitnn");
//SSI0时钟允许
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
//允许GPIOA模块的时钟,因为GPIOA2,GPIOA3,GPIOA4,GPIOA5是SSI0引脚,允许时钟后才能使用SSI0模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//设定PA2&PA3&PA4&PA5为SSI0引脚,GPIOPinConfigure设定GPIOPCTL和GPIOAPSEL寄存器.
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA3_SSI0FSS);
GPIOPinConfigure(GPIO_PA4_SSI0RX);
GPIOPinConfigure(GPIO_PA5_SSI0TX);
//GPIOPinTypeSSI中设定相关引脚的方向和上拉大小,推挽式无弱上拉
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |
GPIO_PIN_2);
//SSIConfigSetExpClk(SSI的基础地址,供给SSI的时钟即系统时钟,SSI的数据格式SPI格式还是TI格式,
// SSI是作为主模式还是从模式,设置BITRATE,设置数据长度)
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(SYSTEM_CLOCK_SPEED),
SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, USER_BITRATE, 8);
//设置SSICR1[SSE]寄存器,允许SSI0
SSIEnable(SSI0_BASE);
//接收数据,直到无数据直接返回0
while(SSIDataGetNonBlocking(SSI0_BASE, &ulDataRx[0]))
[
]
//SSI1时钟允许
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
//允许GPIOE模块的时钟,因为GPIOE0,GPIOE1,GPIOE2,GPIOE3是SSI1引脚,允许时钟后才能使用SSI1模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
//设定PA2&PA3&PA4&PA5为SSI1引脚,GPIOPinConfigure设定GPIOPCTL和GPIOAPSEL寄存器.
GPIOPinConfigure(GPIO_PE0_SSI1CLK);
GPIOPinConfigure(GPIO_PE1_SSI1FSS);
GPIOPinConfigure(GPIO_PE2_SSI1RX);
GPIOPinConfigure(GPIO_PE3_SSI1TX);
//GPIOPinTypeSSI中设定相关引脚的方向和上拉大小,推挽式无弱上拉
GPIOPinTypeSSI(GPIO_PORTE_BASE, GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 |
GPIO_PIN_0);
//SSIConfigSetExpClk(SSI的基础地址,供给SSI的时钟即系统时钟,SSI的数据格式SPI格式还是TI格式,
// SSI是作为主模式还是从模式,设置BITRATE,设置数据长度)
SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(SYSTEM_CLOCK_SPEED),
SSI_FRF_MOTO_MODE_0,
SSI_MODE_SLAVE, USER_BITRATE, 8);
//设置SSICR1[SSE]寄存器,允许SSI1
SSIEnable(SSI1_BASE);
//接收数据,直到无数据直接返回0
while(SSIDataGetNonBlocking(SSI1_BASE, &ulDataRx[0]))
[
]
//初始化需要发送的数据
ulDataTx[0] = 'M';
ulDataTx[1] = '3';
ulDataTx[2] = 'S';
ulDataTx[3] = 'P';
ulDataTx[4] = 'I';
ulDataTx[5] = 'A';
ulDataTx[6] = 'B';
ulDataTx[7] = 'C';
//UART输出
UARTprintf("Sent:n ");
// 发送3个数据
for(ulindex = 0; ulindex < NUM_SSI_DATA; ulindex++)
[
// UART显示正在发送的数据
UARTprintf("'%c' ", ulDataTx[ulindex]);
//发送数据,把一个数据写入SSI0 的TX FIFO(如无空间一直等待)
SSIDataPut(SSI0_BASE, ulDataTx[ulindex]);
]
//通过SSIDR[BSY]确认SSI发送是否为忙,用于确认所有的发送是否都已完成
while(SSIBusy(SSI0_BASE))
[
]
// UART显示
UARTprintf("nReceived:n ");
// 接收3次数据
for(ulindex = 0; ulindex < NUM_SSI_DATA; ulindex++)
[
//接收数据,把一个数据读出SSI1 的RX FIFO(如无数据直接返回)
//前面用SSIBusy确认数据都发完了,所以可以NonBlocking
SSIDataGetNonBlocking(SSI1_BASE, &ulDataRx[ulindex]);
// 只要低八位
ulDataRx[ulindex] &= 0x00FF;
//输出接收到的数据
UARTprintf("'%c' ", ulDataRx[ulindex]);
]
// 看看数据是否都正确
for(ulindex = 0; ulindex < NUM_SSI_DATA; ulindex++)
[
if(ulDataTx[ulindex] != ulDataRx[ulindex])
[
// 告诉用户测试错误
UARTprintf("nnError: Data does not exactly match.n");
UARTprintf("Check that the SPI signals are connected.nn");
// Wait in infinite loop for debugging.
while(1)
[
]
]
]
// 说明测试通过
UARTprintf("nnTest Passed.nn");
// Return no errors
return(0);
]
引用: Emily1225 发表于 2019-8-28 14:38
例程如下,该例程在同一块芯片上使用SSI0模块为主,SSI1模块为从,一个发送一个接收,需要外部连接两个SSI模块的对应引脚。
这其实和2块板子通信原理完全一样。另外附件中还有另外3个例程也可以一并同时参考。
外部引脚连接:
对应程序:
//*****************************************************************************
//
// 设定 SSI0 为SPI主模式,SSI1 为SPI从模式
// SSI0,发送8位数据,SSI1接收
//
//*****************************************************************************
int
main(void)
[
unsigned long ulDataTx[NUM_SSI_DATA];
unsigned long ulDataRx[NUM_SSI_DATA];
unsigned long ulindex;
//必须写入0xA5A5A5A5,之后才能够改写一些被MWRALLOW保护的寄存器
HWREG(SYSCTL_MWRALLOW) = 0xA5A5A5A5;
// 设定 PLL,Fout=300M,M3 running at 75MHz and C28 running at 150MHz
SysCtlClockConfigSet(SYSCTL_SYSDIV_1 | SYSCTL_M3SSDIV_2 | SYSCTL_USE_PLL |
(SYSCTL_SPLLIMULT_M & 0x0F));
// 该子程序用于设定串口,调试时可以看到串口输出
// 设定PE4,PE5为SCI功能,115200的速度
InitConsole();
// UART输出
UARTprintf("SSI ->n");
UARTprintf(" Mode: SPIn");
UARTprintf(" Data: 8-bitnn");
//SSI0时钟允许
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
//允许GPIOA模块的时钟,因为GPIOA2,GPIOA3,GPIOA4,GPIOA5是SSI0引脚,允许时钟后才能使用SSI0模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//设定PA2&PA3&PA4&PA5为SSI0引脚,GPIOPinConfigure设定GPIOPCTL和GPIOAPSEL寄存器.
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA3_SSI0FSS);
GPIOPinConfigure(GPIO_PA4_SSI0RX);
GPIOPinConfigure(GPIO_PA5_SSI0TX);
//GPIOPinTypeSSI中设定相关引脚的方向和上拉大小,推挽式无弱上拉
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |
GPIO_PIN_2);
//SSIConfigSetExpClk(SSI的基础地址,供给SSI的时钟即系统时钟,SSI的数据格式SPI格式还是TI格式,
// SSI是作为主模式还是从模式,设置BITRATE,设置数据长度)
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(SYSTEM_CLOCK_SPEED),
SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, USER_BITRATE, 8);
//设置SSICR1[SSE]寄存器,允许SSI0
SSIEnable(SSI0_BASE);
//接收数据,直到无数据直接返回0
while(SSIDataGetNonBlocking(SSI0_BASE, &ulDataRx[0]))
[
]
//SSI1时钟允许
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
//允许GPIOE模块的时钟,因为GPIOE0,GPIOE1,GPIOE2,GPIOE3是SSI1引脚,允许时钟后才能使用SSI1模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
//设定PA2&PA3&PA4&PA5为SSI1引脚,GPIOPinConfigure设定GPIOPCTL和GPIOAPSEL寄存器.
GPIOPinConfigure(GPIO_PE0_SSI1CLK);
GPIOPinConfigure(GPIO_PE1_SSI1FSS);
GPIOPinConfigure(GPIO_PE2_SSI1RX);
GPIOPinConfigure(GPIO_PE3_SSI1TX);
//GPIOPinTypeSSI中设定相关引脚的方向和上拉大小,推挽式无弱上拉
GPIOPinTypeSSI(GPIO_PORTE_BASE, GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 |
GPIO_PIN_0);
//SSIConfigSetExpClk(SSI的基础地址,供给SSI的时钟即系统时钟,SSI的数据格式SPI格式还是TI格式,
// SSI是作为主模式还是从模式,设置BITRATE,设置数据长度)
SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(SYSTEM_CLOCK_SPEED),
SSI_FRF_MOTO_MODE_0,
SSI_MODE_SLAVE, USER_BITRATE, 8);
//设置SSICR1[SSE]寄存器,允许SSI1
SSIEnable(SSI1_BASE);
//接收数据,直到无数据直接返回0
while(SSIDataGetNonBlocking(SSI1_BASE, &ulDataRx[0]))
[
]
//初始化需要发送的数据
ulDataTx[0] = 'M';
ulDataTx[1] = '3';
ulDataTx[2] = 'S';
ulDataTx[3] = 'P';
ulDataTx[4] = 'I';
ulDataTx[5] = 'A';
ulDataTx[6] = 'B';
ulDataTx[7] = 'C';
//UART输出
UARTprintf("Sent:n ");
// 发送3个数据
for(ulindex = 0; ulindex < NUM_SSI_DATA; ulindex++)
[
// UART显示正在发送的数据
UARTprintf("'%c' ", ulDataTx[ulindex]);
//发送数据,把一个数据写入SSI0 的TX FIFO(如无空间一直等待)
SSIDataPut(SSI0_BASE, ulDataTx[ulindex]);
]
//通过SSIDR[BSY]确认SSI发送是否为忙,用于确认所有的发送是否都已完成
while(SSIBusy(SSI0_BASE))
[
]
// UART显示
UARTprintf("nReceived:n ");
// 接收3次数据
for(ulindex = 0; ulindex < NUM_SSI_DATA; ulindex++)
[
//接收数据,把一个数据读出SSI1 的RX FIFO(如无数据直接返回)
//前面用SSIBusy确认数据都发完了,所以可以NonBlocking
SSIDataGetNonBlocking(SSI1_BASE, &ulDataRx[ulindex]);
// 只要低八位
ulDataRx[ulindex] &= 0x00FF;
//输出接收到的数据
UARTprintf("'%c' ", ulDataRx[ulindex]);
]
// 看看数据是否都正确
for(ulindex = 0; ulindex < NUM_SSI_DATA; ulindex++)
[
if(ulDataTx[ulindex] != ulDataRx[ulindex])
[
// 告诉用户测试错误
UARTprintf("nnError: Data does not exactly match.n");
UARTprintf("Check that the SPI signals are connected.nn");
// Wait in infinite loop for debugging.
while(1)
[
]
]
]
// 说明测试通过
UARTprintf("nnTest Passed.nn");
// Return no errors
return(0);
]
举报