This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28377D的SPI与传感器的通信

Other Parts Discussed in Thread: TMS320F28377D

说明:传感器工作在SPI的模式0,传输速度最高10MHZ,MSB,8bit数据;

程序概括:使用芯片的SPIB引脚,根据官方例程进行代码修改,完成寄存器配置

目前程序现象:已关闭自循环标志位,但是发送数据以后,还是会在接收寄存器观察到相同的数据,就是发什么接受什么。

代码:

1、主程序

#include "F28x_Project.h"

void spi_xmit(Uint16 a);
void spi_fifo_init(void);
void spib_fifo_init(void);
unsigned char spib_xmit(unsigned char a);
unsigned char RecData;
unsigned char SendData;
void main(void)
{
   InitSysCtrl();
   InitSpibGpio();
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();
   spib_fifo_init();     // Initialize the SPI FIFO
   SendData = 0x00;
   for(;;)
   {
       RecData = spib_xmit(SendData);
       SendData++;
       if(SendData == 0xFF)
       {
           SendData = 0x00;
       }

   }
}
//
// spi_fifo_init - Initialize SPIB FIFO
//
void spib_fifo_init(void)
{
    //
    // Initialize SPI FIFO registers
    //
    SpibRegs.SPIFFTX.all = 0xE040;
    SpibRegs.SPIFFRX.all = 0x2044;
    SpibRegs.SPIFFCT.all = 0x0;

    //
    // Initialize core SPI registers
    //
    InitSpib();
}

//
// spi_xmit - Transmit value via SPI
//
unsigned char spib_xmit(unsigned char a)
{
    unsigned char Receive;
    SpibRegs.SPITXBUF = a;
    while(SpibRegs.SPIFFRX.bit.RXFFST !=1) { }
    Receive = SpibRegs.SPIRXBUF;
    Receive = Receive >> 8;
    return Receive;
}
//
// End of file
//

2、SPIB的引脚和寄存器配置

void InitSpib(void)
{
    // Initialize SPI-B

    // Set reset low before configuration changes
    // Clock polarity (0 == rising, 1 == falling)
    // 8-bit character
    // Disable loop-back
    SpibRegs.***.bit.SPISWRESET = 0;
    SpibRegs.***.bit.CLKPOLARITY = 0;
    SpibRegs.***.bit.*** = (8-1);
    SpibRegs.***.bit.SPILBK = 0;

    // Enable master (0 == slave, 1 == master)
    // Enable transmission (Talk)
    // Clock phase (0 == normal, 1 == delayed)
    // SPI interrupts are disabled
    SpibRegs.***.bit.MASTER_SLAVE = 1;
    SpibRegs.***.bit.TALK = 1;
    SpibRegs.***.bit.CLK_PHASE = 0;
    SpibRegs.***.bit.SPIINTENA = 0;

    // Set the baud rate
    SpibRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;

    // Set FREE bit
    // Halting on a breakpoint will not halt the SPI
    SpibRegs.SPIPRI.bit.FREE = 1;

    // Release the SPI from reset
    SpibRegs.***.bit.SPISWRESET = 1;
}
void InitSpibGpio(void)
{
   EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;  // Enable pull-up on GPIO16 (SPISIMOB)
    GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;  // Enable pull-up on GPIO17 (SPISOMIB)
    GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;  // Enable pull-up on GPIO18 (***)
    GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;  // Enable pull-up on GPIO19 (SPISTEB)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3; // Asynch input GPIO16 (SPISIMOB)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3; // Asynch input GPIO17 (SPISOMIB)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3; // Asynch input GPIO18 (***)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3; // Asynch input GPIO19 (SPISTEB)

    GpioCtrlRegs.GPAGMUX2.bit.GPIO24 = 1; // Configure GPIO16 as SPISIMOA
    GpioCtrlRegs.GPAGMUX2.bit.GPIO25 = 1; // Configure GPIO17 as SPISOMIA
    GpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 1; // Configure GPIO18 as ***
    GpioCtrlRegs.GPAGMUX2.bit.GPIO27 = 1; // Configure GPIO19 as SPISTEA

    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 2; // Configure GPIO16 as SPISIMOA
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 2; // Configure GPIO17 as SPISOMIA
    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 2; // Configure GPIO18 as ***
    GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 2; // Configure GPIO19 as SPISTEA
    EDIS;
}