TI中文支持网
TI专业的中文技术问题搜集分享网站

双F28335芯片进行spi通信,波形能够正常显示,但是RXBUF寄存器一直显示高电平

最近做的一个28335的板子,尝试进行主从机的spi通信,按照自发自收的例程以及网上查到的资料写了个循环通信的程序,发现不好使,然后尝试单次发送数据,主机发送C511等待从机接收。发现示波器上显示如下图,但是从机的RXBUF一直显示接收的全是高电平,我尝试了发送一位,八位,16位都是这样。

ps:从机在发送之前往TXBUF里写入了传输的数据

       设置断点观察,FIFO的溢出中断标志位没有置位

       目前程序中使用的是查询的方式,但之前也试过从机的接收中断,情况一样

       虽然我暂时不想要从机数据,但是用示波器观察SOMI,通信过程中,一直处于高电平状态,无数据发送

发送八位数据时的寄存器值(在  that->u16RecvDataL_spi = SpiaRegs.SPIRXBUF   设置的中断)

主机相关程序

void SPI_DRIVE_init(SPI_DRIVE *that){             //初始化
    //
    // Initialize SPI FIFO registers
    //
    SpiaRegs.SPIFFTX.all=0xE040;            //使能FIFO;清除发送中断标志位;  禁止FIFO发送中断;发送中断级别定义为0
    SpiaRegs.SPIFFRX.all=0x204F;            //清除FF溢出标志位;清除溢出接受中断标志位;  禁止FF接受中断;接受中断级别为16;
    SpiaRegs.SPIFFCT.all=0x0;               //SPITXBUF到移位寄存器传送不延迟;
    //SpiaRegs.***.bit.TALK = 0;
    // Initialize SPI registers
    SpiaRegs.***.all =0x000F;        // Reset on, rising edge, 16-bit char bits  软件复位进行寄存器更改 输入参数11位
    //
    // Enable master mode, normal phase, enable talk, and SPI int disabled.启用主机模式,正常相位,启用通话和禁用SPI int。
    //
    SpiaRegs.***.all =0x000E;//*** 主动模式   主机保持设置  关闭溢出中断
    SpiaRegs.SPIBRR =0x008F;    //SPI波特率=LSPCLK/(SPIBRR+1)
    SpiaRegs.***.all =0x0087;   // Relinquish SPI from Reset输出极性 字符移入量16位
    SpiaRegs.SPIPRI.bit.FREE = 1;  // Set so breakpoints don't disturb xmission 自由运行
}
    void SPI_DRIVE_write(SPI_DRIVE *that){                            //主机写入
    that->u16SendDataL_spi= 0xC511;   
    GpioDataRegs.GPBDAT.bit.GPIO57 = 0;    //输出   选中从机
    SpiaRegs.SPITXBUF = that->u16SendDataL_spi;
    //DELAY_US(600);
}
Uint16 SPI_DRIVE_read(SPI_DRIVE *that){                            //主机读出
    Uint16 u16RecvData_spi = 0;
    Uint32 u32TimeCounter = 0;
    // wait for data transmission finished, if time out, return.
    // while((SpiaRegs.SPISTS.bit.INT_FLAG !=1)){
        while((SpiaRegs.SPIFFRX.bit.RXFFST !=1)){   //2 接收FIFO有1个字
        u32TimeCounter++;
        if (u32TimeCounter > that->u32DeadLineTime_spi)
        {
            return 0;
        }
    }
    that->u16RecvDataL_spi = SpiaRegs.SPIRXBUF;   //从输出缓存中读出 (读出数据为右对齐16位)
    GpioDataRegs.GPBDAT.bit.GPIO57 = 1;    //输出     断开从机
    u16RecvData_spi = that->u16RecvDataL_spi;
    return u16RecvData_spi;
}
从机程序

void SPI_DRIVE_init_ex(SPI_DRIVE *that){
//
// Initialize SPI FIFO registers
//

SpiaRegs.SPIFFTX.bit.TXFIFO=0;
SpiaRegs.SPIFFTX.all=0xE040; //使能FIFO;清除发送中断标志位; 禁止FIFO发送中断;发送中断级别定义为0
SpiaRegs.SPIFFRX.bit.RXFIFORESET=0;
SpiaRegs.SPIFFRX.all=0x204F; //清除FF溢出标志位;清除溢出接受中断标志位; 禁止FF接受中断;接受中断级别为16;
SpiaRegs.SPIFFCT.all=0x0; //SPITXBUF到移位寄存器传送不延迟;

// Initialize SPI registers
SpiaRegs.***.all =0x000F; // Reset on, rising edge, 16-bit char bits 软件复位进行寄存器更改 输入参数16位
//
// Enable master mode, normal phase, enable talk, and SPI int disabled.启用主机模式,正常相位,启用通话和禁用SPI int。
//
SpiaRegs.***.all =0x000A;//*** 从机保持设置 关闭溢出中断使能
SpiaRegs.SPIBRR =0x002F; //SPI波特率=LSPCLK/(SPIBRR+1)
SpiaRegs.***.all =0x0087; // Relinquish SPI from Reset输出极性 字符移入量
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission 自由运行

}

void SPI_DRIVE_write_ex(SPI_DRIVE *that){
Uint16 u16RecvData_spi = 0;
Uint32 u32TimeCounter = 0;
that->u16SendDataL_spi=0x1234;
//while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1){}
SpiaRegs.SPITXBUF = that->u16SendDataL_spi; //传输前的写入
// DELAY_US(600);
//while (SpiaRegs.SPISTS.bit.INT_FLAG !=1){}
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }//spi的fifo存够

that->u16RecvDataL_spi = SpiaRegs.SPIRXBUF; //从输出缓存中读出 (读出数据为右对齐16位)

u16RecvData_spi = that->u16RecvDataL_spi;
// return u16RecvData_spi;

GPIO

主机

// ***
GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0; // Enable pullup on GPIO57 (新增部分:双spi通信的片选信号 57口)
GpioDataRegs.GPBDAT.bit.GPIO57 = 1; // Load output latch
GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0; // GPIO57 = GPIO57
GpioCtrlRegs.GPBDIR.bit.GPIO57 = 1; // GPIO32 = output

从机

// ***
GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0; // Disable pullup on GPIO57 (新增部分:双spi通信的片选信号 57口)
GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // GPIO57 = cs
GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO21 (SOMIA) 异步输入

li broune:

从机波特率和主机一样,上面的程序是我之前验证一个想法时改的。

,

Green Deng:

你好,不知道这块板子运行其他程序有没有异常?能否排除硬件上的问题?

,

li broune:

不好意思,这几天板子不在我这,硬件是公司那边设计的,板子运行其他程序没有问题,我之前还用mcbsp配了spi通信正常

,

li broune:

换了个示波器,发现了一些问题,MOSI信号电压在0.5V左右,会不会是这里的问题

,

li broune:

不好意思,问题已经解决了,是硬件的问题,硬件设计把simo和somi的先接反了。接正确后,从机能够正确接收主机信号了

,

Green Deng:

抱歉漏回了,感谢你的反馈。

赞(0)
未经允许不得转载:TI中文支持网 » 双F28335芯片进行spi通信,波形能够正常显示,但是RXBUF寄存器一直显示高电平
分享到: 更多 (0)