5603|7

78

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

在做两块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);
}



最新回复

楼主你的程序可否发下给我呀??最近在研究,搞不定   详情 回复 发表于 2015-3-27 10:50
 
点赞 关注(1)

回复
举报

569

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
楼主示波器上,能看到主机有发送数据吗?
 
 

回复

78

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

回复 沙发 hlx3012 的帖子

没有波形,我之前在一块板子上使用SSI0模块为主,SSI1模块为从,一个发送一个接收。成功了。我把这个程序拆开分别下到两个板子里一个不停的发送,另一个不停的接收就不行了。弄了一天了。
 
 
 

回复

569

帖子

0

TA的资源

五彩晶圆(中级)

4
 
我提几点建议,楼主看看有没帮助:

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

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

3、在你之前的一块板子上,把你的主机程序放进去有数据发出吗?如果有,那么同样的程序同样的芯片。你现在这块板子为什么会没有数据发出,硬件有问题?
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(高级)

5
 

回复 4楼 hlx3012 的帖子

应该没有问题,应该是程序的问题,我再好好检查检查,改好了再和大家一起分享下心得。

点评

楼主你的程序可否发下给我呀??最近在研究,搞不定  详情 回复 发表于 2015-3-27 10:50
 
 
 

回复

16

帖子

1

TA的资源

一粒金砂(中级)

6
 

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

SSI只有在主机模式下,才能产生SCLK。即从机若想发送数据,反过来想就是主机接收从机数据(读取从机),可这样写函数://接收一个字节
unsigned char ssi_Get_c(void)
{
   unsigned long ReadData;
   SSIDataPut(SSI0_BASE, 0xff);//发送一个无效字节,以产生接收时钟
   SSIDataGet(SSI0_BASE, &ReadData);
   return (unsigned char)ReadData;
}
注:飞思卡尔的SPI模式为全双工通信,即同时收发。无论是要主机收发动作,还是从机收发动作,归根结底都先要在主机上产生SCLK,如“SSIDataPut(SSI0_BASE, 0xff);//发送一个无效字节,以产生接收时钟”,就是这个目的。
 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

7
 
参考一下SD卡的例程,里面有SPI通信代码,从机接收最好用中断。
 
 
 

回复

24

帖子

1

TA的资源

一粒金砂(中级)

8
 
fendou 发表于 2012-2-16 19:54
应该没有问题,应该是程序的问题,我再好好检查检查,改好了再和大家一起分享下心得。

楼主你的程序可否发下给我呀??最近在研究,搞不定
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表