在做两块LM3S9B96用spi通信,从机收不到数。
[复制链接]
把主机发送和从机接收的程序附上 请大家帮我看看问题出在哪里?先谢谢了。
SPI_rec_slave(从机接收程序)
#include "inc/hw_memmap.h" #include "inc/hw_ssi.h" #include "inc/hw_types.h" #include "driverlib/ssi.h" #include "driverlib/gpio.h" #include "driverlib/sysctl.h" #include "driverlib/uartstdio.h"
#define NUM_SSI_DATA 8 #define USER_BITRATE 115200
InitConsole(void) { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); UARTStdioInit(0); } /*****************************************************************************/ int main(void) { unsigned long ulDataRx[NUM_SSI_DATA]; unsigned long ulindex; // // Set the clocking to run directly from the external crystal/oscillator. // TODO: The SYSCTL_XTAL_ value must be changed to match the value of the // crystal on your board. // SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); InitConsole(); //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的时钟即系统时钟的30分频,SSI的数据格式SPI格式还是TI格式, // SSI是作为主模式还是从模式,设置BITRATE,设置数据长度) SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet()/30, SSI_FRF_MOTO_MODE_0, SSI_MODE_SLAVE, USER_BITRATE, 8);
//设置SSICR1[SSE]寄存器,允许SSI1 SSIEnable(SSI1_BASE); UARTprintf("\n\nTest Start.\n\n"); //接收数据,直到无数据直接返回0 while(SSIDataGetNonBlocking(SSI1_BASE, &ulDataRx[0])) { }
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]); } // 说明测试通过
// Return no errors return(0); } SPI_send_master(主机发送程序)#include "inc/hw_memmap.h" #include "inc/hw_ssi.h" #include "inc/hw_types.h" #include "driverlib/ssi.h" #include "driverlib/gpio.h" #include "driverlib/sysctl.h"
#define NUM_SSI_DATA 8 #define USER_BITRATE 115200
int main(void) { unsigned long ulDataTx[NUM_SSI_DATA]; unsigned long ulDataRx[NUM_SSI_DATA]; unsigned long ulindex;
// // Set the clocking to run directly from the external crystal/oscillator. // TODO: The SYSCTL_XTAL_ value must be changed to match the value of the // crystal on your board. // SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); // // The SSI0 peripheral must be enabled for use. // //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的时钟即系统时钟的30分频,SSI的数据格式SPI格式还是TI格式, // SSI是作为主模式,设置BITRATE,设置数据长度) SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet()/30, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, USER_BITRATE, 8);
//设置SSICR1[SSE]寄存器,允许SSI0 SSIEnable(SSI0_BASE);
//接收数据,直到无数据直接返回0 while(SSIDataGetNonBlocking(SSI0_BASE, &ulDataRx[0])) { } // // Initialize the data to send. // //初始化需要发送的数据 ulDataTx[0] = 'M'; ulDataTx[1] = '3'; ulDataTx[2] = 'S'; ulDataTx[3] = 'P'; ulDataTx[4] = 'I'; ulDataTx[5] = 'A'; ulDataTx[6] = 'B'; ulDataTx[7] = 'C';
for(ulindex = 0; ulindex < NUM_SSI_DATA; ulindex++) {
//发送数据,把一个数据写入SSI0 的TX FIFO(如无空间一直等待) SSIDataPut(SSI0_BASE, ulDataTx[ulindex]); }
return(0); }
|