两块LM3S9B96 SPI通信问题

2019-03-24 13:05发布

我在一块板子上用SSI0做主发送数据,SSI1做从接收数据可以。但是我把程序拆分开,分别把主从程序下载到两块LM3S9B96板子中,链接都建立不上,用示波器根本看不到波形。下面是两个程序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"#include "utils/uartstdio.h"#define NUM_SSI_DATA 8#define USER_BITRATE 1000//*****************************************************************************// 设定 SSI0 为SPI主模式,//*****************************************************************************intmain(void){   unsigned long ulDataTx[NUM_SSI_DATA];   unsigned long ulindex;   SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |                  SYSCTL_XTAL_16MHZ);   SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);   //设定PA2&PA3&PA4&PA5为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);   SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(),                      SSI_FRF_MOTO_MODE_0,                      SSI_MODE_MASTER, USER_BITRATE, 8);   SSIEnable(SSI0_BASE);   while(1){   ulDataTx[0] = 'M';   ulDataTx[1] = '3';   ulDataTx[2] = 'S';   ulDataTx[3] = 'P';   ulDataTx[4] = 'I';   ulDataTx[5] = 'S';   ulDataTx[6] = 'S';   ulDataTx[7] = 'I';   for(ulindex = 0; ulindex < NUM_SSI_DATA; ulindex++)   {       SSIDataPut(SSI0_BASE, ulDataTx[ulindex]);   }   //确认SSI发送是否为忙,确认的发送是否已完成   while(SSIBusy(SSI0_BASE))   {   }}}从机程序为:#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 "utils/uartstdio.h"#define NUM_SSI_DATA 8#define USER_BITRATE 1000voidInitConsole(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);}//*****************************************************************************// SSI1 为SPI从模式,接收//*****************************************************************************intmain(void){   unsigned long ulDataRx[NUM_SSI_DATA];   unsigned long ulindex;   SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |                  SYSCTL_XTAL_16MHZ);   InitConsole();   UARTprintf("SSI -> ");   UARTprintf("  Mode: SPI ");   UARTprintf("  Data: 8-bit ");   SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
   //设定PA2&PA3&PA4&PA5为SSI1引脚,
   GPIOPinConfigure(GPIO_PE0_SSI1CLK);   GPIOPinConfigure(GPIO_PE1_SSI1FSS);   GPIOPinConfigure(GPIO_PE2_SSI1RX);   GPIOPinConfigure(GPIO_PE3_SSI1TX);   GPIOPinTypeSSI(GPIO_PORTE_BASE, GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 |                  GPIO_PIN_0);   SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(),                      SSI_FRF_MOTO_MODE_0,                      SSI_MODE_SLAVE, USER_BITRATE, 8);   SSIEnable(SSI1_BASE);   while(SSIDataGetNonBlocking(SSI1_BASE, &ulDataRx[0]))   {   }   UARTprintf(" Received:   ");    while(1)   {      for(ulindex = 0; ulindex < NUM_SSI_DATA; ulindex++)      {          //接收数据,把一个数据读出SSI1 的RX FIFO(如无数据直接返回)          SSIDataGetNonBlocking(SSI1_BASE, &ulDataRx[ulindex]);          ulDataRx[ulindex] &= 0x00FF;          UARTprintf("'%c' ", ulDataRx[ulindex]);      }    }}                                请大家帮忙看看怎么回事? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
fendou
1楼-- · 2019-03-25 00:13
< 外部引脚连接:  
   主机                                从机
   SSI0CLK (PA2) ---> SSI1CLK (PE0)

   SSI0Fss (PA3) ---> SSI1Fss (PE1)

   SSI0Tx  (PA5) ---> SSI1Rx  (PE2)
fendou
2楼-- · 2019-03-25 04:24
 精彩回答 2  元偷偷看……
benbending
3楼-- · 2019-03-25 07:01
在接收发送的时候,不是自动强制拉低的吗?没有明白楼主此处片选的意思,请详细说明。谢谢。
如果可以,请问楼主是不是要想SPI接收到数据,就需要发送一个无效数据才能读取接收到的数据?

一周热门 更多>

相关问题

    相关文章