在做两块LM3S9B96用spi通信,从机收不到数。

2019-03-24 10:24发布

把主机发送和从机接收的程序附上
请大家帮我看看问题出在哪里?先谢谢了。

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);}/*****************************************************************************/intmain(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(" Test Start. ");    //接收数据,直到无数据直接返回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
intmain(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);}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
hlx3012
1楼-- · 2019-03-24 13:22
楼主示波器上,能看到主机有发送数据吗?
fendou
2楼-- · 2019-03-24 14:16
 精彩回答 2  元偷偷看……
hlx3012
3楼-- · 2019-03-24 16:41
我提几点建议,楼主看看有没帮助:

1、既然“之前在一块板子上使用SSI0模块为主,SSI1模块为从,一个发送一个接收。成功了"那么说明软件是正确的

2、既然没有发送波形说明主机没有发出数据,那么先检查主机

3、在你之前的一块板子上,把你的主机程序放进去有数据发出吗?如果有,那么同样的程序同样的芯片。你现在这块板子为什么会没有数据发出,硬件有问题?
fendou
4楼-- · 2019-03-24 16:44
应该没有问题,应该是程序的问题,我再好好检查检查,改好了再和大家一起分享下心得。
淼淼一江
5楼-- · 2019-03-24 17:10
 精彩回答 2  元偷偷看……
yanhy
6楼-- · 2019-03-24 21:33
参考一下SD卡的例程,里面有SPI通信代码,从机接收最好用中断。

一周热门 更多>

相关问题

    相关文章