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.

[参考译文] TMS320F28379D:TMS320F28379D

Guru**** 2589280 points
Other Parts Discussed in Thread: TMS320F28379D, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1208754/tms320f28379d-tms320f28379d

器件型号:TMS320F28379D
主题中讨论的其他器件: C2000WARE

您好!

我正在尝试通过 SPI 将 MPU9250连接到 TMS320F28379D。 然而,我正面临着从 IMU 读取的一个问题。 读取缓冲器的值未改变。 此外、当我在进入 while 循环前将发送 FIFO 中断级别位设置为1时、该操作无效。 所以我将其保留为2。 我发送了寄存器地址两次。 我不确定 Launchpad 的问题是否会导致将 IMU 连接到 I2C、我需要放置外部上拉电路、正如我看到的建议。 但我找不到任何类似的 SPI。 我没有发现任何类似的问题。 下面附有该代码。 我同时使用两个 CPU、但 CPU2的代码并不相关、因此我只附加 CPU1的代码。 我查看了 C2000Ware_4_02_00_00中的 bitfiled 示例、但所有示例都是环回示例。

提前感谢、

#include "F28x_Project.h"
#include <math.h>
//#include"KF.h"
#include "UKF_IMU.h"
#include "F28x_Project.h"
#include "F2837xD_Ipc_drivers.h"
//
//SPI connected with MPU9250 "IMU"
//


//
// define the address of each register from the MPU-9250 Register Map and Descriptions Revision 1.6.pdf
//
#define MPU9250_SMPLRT_DIV     0x0019

#define MPU9250_CONFIG         0x001A
#define MPU9250_GYRO_CONFIG    0x001B
#define MPU9250_ACCEL_CONFIG   0x001C
#define MPU9250_ACCEL_CONFIG2  0x001D

#define MPU9250_ACCEL_XOUT_H   0x003B
#define MPU9250_ACCEL_XOUT_L   0x003C
#define MPU9250_ACCEL_YOUT_H   0x003D
#define MPU9250_ACCEL_YOUT_L   0x003E
#define MPU9250_ACCEL_ZOUT_H   0x003F
#define MPU9250_ACCEL_ZOUT_L   0x0040

#define MPU9250_GYRO_XOUT_H    0x0043
#define MPU9250_GYRO_XOUT_L    0x0044
#define MPU9250_GYRO_YOUT_H    0x0045
#define MPU9250_GYRO_YOUT_L    0x0046
#define MPU9250_GYRO_ZOUT_H    0x0047
#define MPU9250_GYRO_ZOUT_L    0x0048

#define MPU9250_USER_CTRL      0x006A
#define MPU9250_PWR_MGMT_1     0x006B

#define DEG_RAD 0.017453292

//
// function to initialize timer0
//
void Ini_timer0(void);
//
// function to initialize SPI peripheral
//
void spi_fifo_init(void);
//
// reading the Accelerometer data
//
void ACC_A(double x_dd, double y_dd, double z_dd);

//
// interrupt function of SPI
//
__interrupt void spiTxFifoIsr(void);
__interrupt void spiRxFifoIsr(void);
//
// interrupt function to store data
//
__interrupt void IPPC0_ISR(void);

Uint16 FailCount;
Uint16 Send_sensor_regs,Ind;
//
// Function Prototypes
//


struct SPIMsgIn {
                   Uint16 sensor_Reg;
                   int16 MsgBuffer[12];
};

struct SPIMsgOut {
                    Uint16 MPU9250_Reg;
                    Uint16 outMsg;
};
struct SPIMsgIn *CurrentMsgPtr;
struct SPIMsgOut *CurrentMsgPtrW;
Uint16 SPI_WriteData(struct SPIMsgOut *msg);
void SPI_ReadData(Uint16 msg);

int i,j,k,k1,k2,k3,k4,k5,a,f;
double dx,dy,dz,accX,accY,accZ;
double dx_f,dy_f,dz_f,accX_f,accY_f,accZ_f,tt,ts;
double in_buffer[6][20];
double temp1,temp2,temp3,temp4,temp5,temp6;
double roll,pitch,KF_roll,KF_pitch,AR;
int GGG, counter2;
int go;
int go2;
int transmit;
Uint32 cpusend;

UKF R_UKF,P_UKF;


void main(void)
   {


    struct SPIMsgIn   SPI_Msgin;
    struct SPIMsgOut  SPI_Msgout;

      //
      // Initialize System Control:
      //
      InitSysCtrl();
      //
      // initialize GPIO
      //
      InitGpio();


      //
      // connect SCIB with CPU2 for Bluetooth connection
      //
      EALLOW;
      DevCfgRegs.CPUSEL5.bit.SCI_B =1;
      EDIS;

    //
    // Give CPU2 Control of the GPIO19 and GPIO18
    //
      GPIO_SetupPinMux(19, GPIO_MUX_CPU2, 2);
      GPIO_SetupPinOptions(19, GPIO_INPUT, GPIO_PUSHPULL);
      GPIO_SetupPinMux(18, GPIO_MUX_CPU2, 2);
      GPIO_SetupPinOptions(18, GPIO_OUTPUT, GPIO_ASYNC);
    //
    //Clear all interrupts and initialize PIE vector table:
    //
    DINT;
    //
    // Initialize PIE control registers to their default state.
    //
    InitPieCtrl();


    //
    // Disable CPU interrupts and clear all CPU interrupt flags:
    //
    IER |= 0x0000;
    IFR=0x0000;
    //
    //clear the IPC flag
    //
    IpcRegs.IPCCLR.bit.IPC0= 1;
    //
    //clears it and allows another interrupt from the corresponding group to propagate
    // it is not important here as after after every single interrupt function
    //
   // PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
   // PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;
    PieCtrlRegs.PIEACK.all = 0x0061;

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR)
    //
    InitPieVectTable();
    //
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
    //
    EALLOW;    // This is needed to write to EALLOW protected registers
    PieVectTable.IPC0_INT = &IPPC0_ISR;    // assign interrupt function of IPC0
    PieVectTable.SPIA_RX_INT = &spiRxFifoIsr;//assign interrupt function of SPIA RX
    PieVectTable.SPIA_TX_INT = &spiTxFifoIsr;//assign interrupt function of SPIA TX
    EDIS;      // This is needed to disable write to EALLOW protected registers
            //
            //Enable vector fetching from ePIE block. This bit must be set to 1 for peripheral interrupts to work.
            //
              EALLOW;
              PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
              IER |= M_INT1;
              EINT;
              EDIS;

              //
              //clear IPC flags
              //
              IpcRegs.IPCCLR.all= 0xFFFFFFFF;
              //
              //enable IPC  Interrupts IN the PIE
              //
              PieCtrlRegs.PIEIER1.bit.INTx13= 1;
              //
              // Enable CPU INT13 which is connected to Timer1 interrupt:
              //
                  IER |= M_INT13;
                  EINT;

               //
               //enable timer1 interrupts IN PIE
               //
                 PieCtrlRegs.PIEIER1.bit.INTx7=1;
               //
               // Enable CPU INT7 which is connected to Timer1 interrupt:
              //
                   IER |= M_INT7;
                   EINT;


           //
           // Enable SPIA_RX,SPIA_TX __interrupt 1,2 in the PIE: Group 6 __interrupt 1,2 table page 102 manul
           //
                  PieCtrlRegs.PIEIER6.bit.INTx1=1;
                  PieCtrlRegs.PIEIER6.bit.INTx2=1;
          //
          // Enable CPU INT6 which is connected to PIE group 6
          //
              IER |= M_INT6;
              EINT; // Enable Global interrupt INTM
              ERTM;  // Enable Global realtime interrupt DBGM
     //
     //SPI initialization
    //
       spi_fifo_init();
    //
    //timer0 initialization
    //
    Ini_timer0();

    //
    //wait here until CPU2 is ready
    //
    while(IpcRegs.IPCSTS.bit.IPC17 != 1)
       {
       }
       IpcRegs.IPCACK.bit.IPC17 = 1;
   //
   // set CurrentMsgPtrW as the message output structure defined in 81 to 86
   //
    CurrentMsgPtrW= &SPI_Msgout;
    //
    // set I2C_IF_DIS bit to '1' in the USER_CTRL register,
    // to disable I2C and work with SPI
    //
    CurrentMsgPtrW->MPU9250_Reg= MPU9250_USER_CTRL;
    CurrentMsgPtrW->outMsg=0x10;
    FailCount=SPI_WriteData(CurrentMsgPtrW);
    while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}

    //
    // Auto selects the best available clock source,
    // else use the Internal oscillator 20 MHZ
    //
    CurrentMsgPtrW->MPU9250_Reg=MPU9250_PWR_MGMT_1;
    CurrentMsgPtrW->outMsg=0x01;
    FailCount= SPI_WriteData(CurrentMsgPtrW);
    while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}

    //
    // set the SMPLRT_DIV to 7 that mean the sample rate = internal sample rate / (7+1)
    // therefore the samplerate will be 10 MHZ/8 = 1.25 MHZ
    //
    CurrentMsgPtrW->MPU9250_Reg= MPU9250_SMPLRT_DIV;
    CurrentMsgPtrW->outMsg=0x07;
    FailCount=SPI_WriteData(CurrentMsgPtrW);
    while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}


    //
    // Enables the FSYNC pin data to be sampled at the ACCEL_ZOUT_L[0]
    //
    CurrentMsgPtrW->MPU9250_Reg= MPU9250_CONFIG;
    CurrentMsgPtrW->outMsg=0x3E;
    FailCount=SPI_WriteData(CurrentMsgPtrW);
    while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}


    //
    // set the Bandwidth (Hz) of the digital low pass filter to 5 Hz for the gyro and
    // the 1000 degree per second
    //
    CurrentMsgPtrW->MPU9250_Reg= MPU9250_GYRO_CONFIG;
    CurrentMsgPtrW->outMsg=0x10;
    FailCount= SPI_WriteData(CurrentMsgPtrW);
    while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}


    //
    // Acceleration Full Scale Select to +-2g [4:3]= "00"
    //
    CurrentMsgPtrW->MPU9250_Reg= MPU9250_ACCEL_CONFIG;
    CurrentMsgPtrW->outMsg=0x00;
    FailCount=SPI_WriteData(CurrentMsgPtrW);
    while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}



    //
    // set the Bandwidth (Hz) of the digital low pass filter to 5 HZ for the accelerometer
    //
    CurrentMsgPtrW->MPU9250_Reg= MPU9250_ACCEL_CONFIG2;
    CurrentMsgPtrW->outMsg=0x0E;
    FailCount=SPI_WriteData(CurrentMsgPtrW);
    while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}

   //  SpiaRegs.SPICCR.bit.SPISWRESET = 0;
     //SpiaRegs.SPIFFTX.all = 0xC021;
    // SpiaRegs.SPIPRI.bit.FREE = 1;
    //SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    //SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
    //SpiaRegs.SPICTL.bit.TALK = 1; // Enable Transmit path
    // SpiaRegs.SPICCR.bit.SPISWRESET = 1;

    SPI_Msgin.MsgBuffer[0] = 0x0000;
    SPI_Msgin.MsgBuffer[1] = 0x0000;
    SPI_Msgin.MsgBuffer[2] = 0x0000;
    SPI_Msgin.MsgBuffer[3] = 0x0000;
    SPI_Msgin.MsgBuffer[4] = 0x0000;
    SPI_Msgin.MsgBuffer[5] = 0x0000;
    SPI_Msgin.MsgBuffer[6] = 0x0000;
    SPI_Msgin.MsgBuffer[7] = 0x0000;
    SPI_Msgin.MsgBuffer[8] = 0x0000;
    SPI_Msgin.MsgBuffer[9] = 0x0000;
    SPI_Msgin.MsgBuffer[10] = 0x0000;
    SPI_Msgin.MsgBuffer[11] = 0x0000;

/*
    // Clear incoming message buffer
         for (int rr = 0; rr < 12; rr++)
            {SPI_Msgin.MsgBuffer[rr] = 0x0000;}
*/

i=0;k=0;

         CpuTimer1Regs.TCR.bit.TRB=1;
         CpuTimer1Regs.TCR.bit.TSS=0;
        //R_UKF.setAngle(0.00); // First set roll starting angle

       // P_UKF.setAngle(0.00); // Then pitch
//f=1;

 while(1)
    {
        CpuTimer0Regs.TCR.bit.TRB=1;
        CpuTimer0Regs.TIM.all=0xFFFFFFFF;
        CpuTimer0Regs.TCR.bit.TSS=0;
        tt= CpuTimer0Regs.TIM.all;

        CurrentMsgPtr= &SPI_Msgin;
        CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_H;
        SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
        SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
        SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;  // Clear Interrupt flag
        while(f==1)
{
switch(i)
{
case 0:CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_H;
f=0;
       break;
case 1:CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_L;
f=0;
       break;
case 2: dx=((CurrentMsgPtr->MsgBuffer[0] << 8) | CurrentMsgPtr->MsgBuffer[1]);

        dx=(dx/131)*DEG_RAD;
        in_buffer[0][k]=dx;
        k=k+1;
         go2= 32;
        f=0;
        CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_YOUT_H;
        break;
case 3: CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_YOUT_L;
f=0;
        break;
case 4:  dy=((CurrentMsgPtr->MsgBuffer[2] << 8) | CurrentMsgPtr->MsgBuffer[3]);
         dy=(dy/131)*DEG_RAD;
         in_buffer[1][k1]=dy;
         k1=k1+1;
         f=0;
         CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_ZOUT_H;
         break;
case 5:  CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_ZOUT_L;
f=0;
         break;
case 6: dz=((CurrentMsgPtr->MsgBuffer[4] << 8) | CurrentMsgPtr->MsgBuffer[5]);
        dz=(dz/131)*DEG_RAD;
        in_buffer[2][k2]=dz;
        CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_XOUT_H;
        k2=k2+1;
        f=0;
        break;
case 7: CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_XOUT_L;
f=0;
        break;
case 8: accX=((CurrentMsgPtr->MsgBuffer[6] << 8) | CurrentMsgPtr->MsgBuffer[7]);
        accX=accX;
        in_buffer[3][k3]=accX;
        k3=k3+1;
        f=0;
        CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_YOUT_H;
        break;
case 9: CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_YOUT_L;
f=0;
        break;
case 10: accY=((CurrentMsgPtr->MsgBuffer[8] << 8) | CurrentMsgPtr->MsgBuffer[9]);
         accY=accY;
         in_buffer[4][k4]=accY;
         CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_ZOUT_H;
         k4=k4+1;
         f=0;
         break;
case 11: CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_ZOUT_L;
f=0;
        break;
case 12: accZ=((CurrentMsgPtr->MsgBuffer[10] << 8) | CurrentMsgPtr->MsgBuffer[11]);

         accZ=accZ;
         in_buffer[5][k5]=accZ;
         CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_H;
         k5=k5+1;
         i=0;
         f=0;
         break;
}

    }

  Send_sensor_regs= CurrentMsgPtr->sensor_Reg; //  transmits data
//  while(SpiaRegs.SPIFFTX.bit.TXFFST!=1) {}
  SPI_ReadData(Send_sensor_regs);
  while(SpiaRegs.SPIFFRX.bit.RXFFINT!=1) {}
    //
    // implement average filter
    //

    for( j=0;j<20;j++)
    {
      temp1+=in_buffer[0][j];

      temp2+=in_buffer[1][j];

      temp3+=in_buffer[2][j];

      temp4+=in_buffer[3][j];

      temp5+=in_buffer[4][j];

      temp6+=in_buffer[5][j];
    }
    dx_f=temp1/20;//0.006667
          temp1=0;
    dy_f=(temp2/20);//+0.148;
          temp2=0;
    dz_f=temp3/20;
          temp3=0;
   accX_f=temp4/20;
          temp4=0;
   accY_f=temp5/20;
          temp5=0;
   accZ_f=temp6/20;
          temp6=0;

        if(k>=20)
           {k=0;}
        if(k1>=20)
        {k1=0;}
        if(k2>=20)
            {k2=0;}
        if(k3>=20)
            {k3=0;}
        if(k4>=20)
            {k4=0;}
        if(k5>=20)
            {k5=0;}

 ACC_A(accX_f,accY_f,accZ_f);

       // ACC_A(accX,accY,accZ);
       if ((roll < -1.5708 && KF_roll > 1.5708) || (roll > 1.5708 && KF_roll < -1.5708))
        {
            //kalmanX.setAngle(roll);
            R_UKF.setAngle(roll);
            KF_roll = roll;


          }
        else
             // KF_roll = kalmanX.getAngle(roll, dx_f, ts); // Calculate the angle using a Kalman filter
        { KF_roll=R_UKF.EstimatUKF(roll, dx_f, ts);
          AR=KF_roll-0.72;
          cpusend= AR*100;

        }
     //  if (abs(KF_roll) > 1.5708)
     //  {  dy_f = -dy_f; }// Invert rate, so it fits the restricted accelerometer reading
     //   KF_pitch = P_UKF.EstimatUKF(pitch, dy_f, ts);


        ts= 0.00000001*(tt-CpuTimer0Regs.TIM.all);
    }
   }



void Ini_timer0()
{
 EALLOW;  // This is needed to write to EALLOW protected registers
     CpuSysRegs.PCLKCR0.bit.CPUTIMER0=1;
     CpuTimer0Regs.TIM.all=0xFFFFFFFF;
     CpuTimer0Regs.PRD.bit.LSW=0xFFFF;
     CpuTimer0Regs.PRD.bit.MSW=0xFFFF;
     CpuTimer0Regs.TCR.bit.TIE=0;
     CpuTimer0Regs.TCR.bit.TIF=1;
     CpuTimer0Regs.TCR.bit.TSS=0;
     CpuTimer0Regs.TCR.bit.TRB=1;
     CpuTimer0Regs.TCR.bit.FREE=1;
     CpuTimer0Regs.TCR.bit.SOFT=0;
     CpuTimer0Regs.TPR.bit.TDDR=0x00;
     CpuTimer0Regs.TPR.bit.PSC=0x0000;
     CpuTimer0Regs.TPRH.bit.TDDRH=0x00;
 EDIS;
}



Uint16 SPI_WriteData(struct SPIMsgOut *msg)
{
    SpiaRegs.SPITXBUF = msg->MPU9250_Reg;
    SpiaRegs.SPITXBUF =msg->outMsg;// Master transmits data
    return 0;
}

void SPI_ReadData (Uint16 msg)
{
    go++;
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    SpiaRegs.SPICTL.bit.TALK = 1; // Enable Transmit path
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    SpiaRegs.SPITXBUF = msg;
    SpiaRegs.SPITXBUF = msg;
    f=1;
    while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}



}
__interrupt void IPPC0_ISR(void)
{

 IpcRegs.IPCACK.bit.IPC0 =1; // clear IPC flag
GGG = 15;
counter2++;

 }


//
void ACC_A(double x_dd, double y_dd, double z_dd)
{
float ss;
    roll = atan2(y_dd,-z_dd);
    ss=pow(z_dd*z_dd + y_dd*y_dd,0.5);
   // pitch = atan2(x_dd,sqrt(y_dd*y_dd + z_dd*z_dd))/DEG_RAD;

    if (y_dd<0)
    {
        pitch=(atan(x_dd/-ss));
    }
    else
    {
        pitch=(atan(x_dd/ss));
    }
    //pitch=pitch/DEG_RAD;
}
void spi_fifo_init()
{
    EALLOW;
            //
            //J2 ....(19"SPICS" ,14"SPISIMO",15"SPI), J1.....(7"SPICLK")  "GPIO 58-61"
            //
            //
            // Enable pull-up on
            //
            GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
            GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
            GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
            GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;
            //
            // Set qualification for selected pins to asynch only
            //
            GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO58 (SPISIMOA)
            GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO59 (SPISOMIA)
            GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO60 (SPICLKA)
            GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO61 (SPISTEA)

           //
           //Configure SPI-A pins using GPIO regs
           //
         GpioCtrlRegs.GPBMUX2.bit.GPIO60=1;GpioCtrlRegs.GPBMUX2.bit.GPIO58=1;
         GpioCtrlRegs.GPBMUX2.bit.GPIO61=1;GpioCtrlRegs.GPBMUX2.bit.GPIO59=1;
         //GpioCtrlRegs.GPBGMUX2.bit.GPIO60=1;GpioCtrlRegs.GPBGMUX2.bit.GPIO58=1;
        // GpioCtrlRegs.GPBGMUX2.bit.GPIO61=1;GpioCtrlRegs.GPBGMUX2.bit.GPIO59=1;

         EDIS;
                       //
    //
    // Initialize SPI FIFO registers
    //
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    SpiaRegs.SPIFFTX.all = 0xC022;    // Enable FIFOs, set TX FIFO level to 2
    SpiaRegs.SPIFFRX.all = 0x0021;    // Set RX FIFO level to 1
    SpiaRegs.SPIFFCT.all = 0x00;



    //InitSpi();

    //
    // Initialize core SPI registers
    //
    // Initialize SPI-A

    // Set reset low before configuration changes
    // Clock polarity (0 == rising, 1 == falling)
    // 16-bit character
    // Enable loop-back

    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
    SpiaRegs.SPICCR.bit.SPILBK = 0;
    ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 0;      // Prescaler - need 7-12 Mhz on module clk
    SpiaRegs.SPICCR.bit.HS_MODE = 1;
    SpiaRegs.SPIBRR.all = 0x5A;                    // here it is set to 10 MHZ
    // Enable master (0 == slave, 1 == master)
    // Enable transmission (Talk)
    // Clock phase (0 == normal, 1 == delayed)
    // SPI interrupts are disabled
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    SpiaRegs.SPICTL.bit.TALK = 1;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    SpiaRegs.SPICTL.bit.SPIINTENA = 0;



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

    // Release the SPI from reset
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
    SpiaRegs.SPIFFTX.bit.TXFIFO=1;
}
__interrupt void spiTxFifoIsr(void)
{

transmit++;



    if(f==1)
    {
        a++;
      // while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Wait until data received
     //  CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
     //  CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;

     //

     //   SpiaRegs.SPICCR.bit.SPISWRESET = 0;
  //  SpiaRegs.SPICTL.bit.TALK = 0; // disable Transmit path
  //  SpiaRegs.SPICCR.bit.SPISWRESET = 1;
   // CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
   // CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;



    if(a>=20)
              {
              IpcRegs.IPCSENDDATA =  cpusend; //write the results to IPC data register
              IpcRegs.IPCSET.bit.IPC1 =1; // set the flag for CPU2
              a=0;
              }
    }
  //  while(SpiaRegs.SPIFFRX.bit.RXFFINT!=1) {}
   // SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ACK
}

//
// spiRxFifoIsr - ISR for SPI receive FIFO
//

__interrupt void spiRxFifoIsr(void)
{
    go2++;
   // SpiaRegs.SPICCR.bit.SPISWRESET = 0;
         //SpiaRegs.SPIFFTX.all = 0xC021;
        // SpiaRegs.SPIPRI.bit.FREE = 1;
        //SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
        //SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
      //  SpiaRegs.SPICTL.bit.TALK = 0; // Enable Transmit path
      //   SpiaRegs.SPICCR.bit.SPISWRESET = 1;

    CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
    //CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;

    i=i+1;
    PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ack


}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为您的 pinmux 配置不正确。 您为所有引脚设置 GPBMUX2 = 1、但这不是 SPI 模式。 您可以在下面的数据表表表中看到。 要将所有引脚用作 SPIA 引脚、需要将 GPBMUX = 3和 GPBGMUX = 3。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gus Martinez:

    感谢您的回复、我在代码中更改了它、但很遗憾、它无法正常工作

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否同时更新了 GPBMUX2和 GPBGMUX2寄存器? 能否分享有关引脚有无功能的进一步观察结果?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我确实如此、代码正在运行并进入中断函数、但 MsgBuffer 的值未得到更新

    #include "F28x_Project.h"
    #include <math.h>
    //#include"KF.h"
    #include "UKF_IMU.h"
    #include "F28x_Project.h"
    #include "F2837xD_Ipc_drivers.h"
    //
    //SPI connected with MPU9250 "IMU"
    //
    
    
    //
    // define the address of each register from the MPU-9250 Register Map and Descriptions Revision 1.6.pdf
    //
    #define MPU9250_SMPLRT_DIV     0x0019
    #define MPU9250_INT_PIN_CFG    0x0037
    #define MPU9250_CONFIG         0x001A
    #define MPU9250_GYRO_CONFIG    0x001B
    #define MPU9250_ACCEL_CONFIG   0x001C
    #define MPU9250_ACCEL_CONFIG2  0x001D
    
    #define MPU9250_ACCEL_XOUT_H   0x003B
    #define MPU9250_ACCEL_XOUT_L   0x003C
    #define MPU9250_ACCEL_YOUT_H   0x003D
    #define MPU9250_ACCEL_YOUT_L   0x003E
    #define MPU9250_ACCEL_ZOUT_H   0x003F
    #define MPU9250_ACCEL_ZOUT_L   0x0040
    
    #define MPU9250_GYRO_XOUT_H    0x0043
    #define MPU9250_GYRO_XOUT_L    0x0044
    #define MPU9250_GYRO_YOUT_H    0x0045
    #define MPU9250_GYRO_YOUT_L    0x0046
    #define MPU9250_GYRO_ZOUT_H    0x0047
    #define MPU9250_GYRO_ZOUT_L    0x0048
    
    #define MPU9250_USER_CTRL      0x006A
    #define MPU9250_PWR_MGMT_1     0x006B
    
    #define DEG_RAD 0.017453292
    
    //
    // function to initialize timer0
    //
    void Ini_timer0(void);
    //
    // function to initialize SPI peripheral
    //
    void spi_fifo_init(void);
    //
    // reading the Accelerometer data
    //
    void ACC_A(double x_dd, double y_dd, double z_dd);
    
    //
    // interrupt function of SPI
    //
    __interrupt void spiTxFifoIsr(void);
    __interrupt void spiRxFifoIsr(void);
    //
    // interrupt function to store data
    //
    __interrupt void IPPC0_ISR(void);
    
    Uint16 FailCount;
    Uint16 Send_sensor_regs,Ind;
    //
    // Function Prototypes
    //
    
    
    struct SPIMsgIn {
                       Uint16 sensor_Reg;
                       int16 MsgBuffer[12];
    };
    
    struct SPIMsgOut {
                        Uint16 MPU9250_Reg;
                        Uint16 outMsg;
    };
    struct SPIMsgIn *CurrentMsgPtr;
    struct SPIMsgOut *CurrentMsgPtrW;
    Uint16 SPI_WriteData(struct SPIMsgOut *msg);
    void SPI_ReadData(struct SPIMsgIn *msg);
    
    int i,j,k,k1,k2,k3,k4,k5,a,f;
    double dx,dy,dz,accX,accY,accZ;
    double dx_f,dy_f,dz_f,accX_f,accY_f,accZ_f,tt,ts;
    double in_buffer[6][20];
    double temp1,temp2,temp3,temp4,temp5,temp6;
    double roll,pitch,KF_roll,KF_pitch,AR;
    int GGG, counter2;
    int go;
    int go2;
    int transmit;
    Uint32 cpusend;
    
    UKF R_UKF,P_UKF;
    
    
    void main(void)
       {
    
    
        struct SPIMsgIn   SPI_Msgin;
        struct SPIMsgOut  SPI_Msgout;
    
          //
          // Initialize System Control:
          //
          InitSysCtrl();
          //
          // initialize GPIO
          //
          InitGpio();
    
    
          //
          // connect SCIB with CPU2 for Bluetooth connection
          //
          EALLOW;
          DevCfgRegs.CPUSEL5.bit.SCI_B =1;
          EDIS;
    
        //
        // Give CPU2 Control of the GPIO19 and GPIO18
        //
          GPIO_SetupPinMux(19, GPIO_MUX_CPU2, 2);
          GPIO_SetupPinOptions(19, GPIO_INPUT, GPIO_PUSHPULL);
          GPIO_SetupPinMux(18, GPIO_MUX_CPU2, 2);
          GPIO_SetupPinOptions(18, GPIO_OUTPUT, GPIO_ASYNC);
        //
        //Clear all interrupts and initialize PIE vector table:
        //
        DINT;
        //
        // Initialize PIE control registers to their default state.
        //
        InitPieCtrl();
    
    
        //
        // Disable CPU interrupts and clear all CPU interrupt flags:
        //
        IER |= 0x0000;
        IFR=0x0000;
        //
        //clear the IPC flag
        //
        IpcRegs.IPCCLR.bit.IPC0= 1;
        //
        //clears it and allows another interrupt from the corresponding group to propagate
        // it is not important here as after after every single interrupt function
        //
       // PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
       // PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;
        //PieCtrlRegs.PIEACK.all = 0x0061;
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR)
        //
        InitPieVectTable();
        //
        // Interrupts that are used in this example are re-mapped to
        // ISR functions found within this file.
        //
        EALLOW;    // This is needed to write to EALLOW protected registers
        PieVectTable.IPC0_INT = &IPPC0_ISR;    // assign interrupt function of IPC0
        PieVectTable.SPIA_RX_INT = &spiRxFifoIsr;//assign interrupt function of SPIA RX
        PieVectTable.SPIA_TX_INT = &spiTxFifoIsr;//assign interrupt function of SPIA TX
        EDIS;      // This is needed to disable write to EALLOW protected registers
                //
                //Enable vector fetching from ePIE block. This bit must be set to 1 for peripheral interrupts to work.
                //
                  EALLOW;
                  PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
                  IER |= M_INT1;
                  EINT;
                  EDIS;
    
                  //
                  //clear IPC flags
                  //
                  IpcRegs.IPCCLR.all= 0xFFFFFFFF;
                  //
                  //enable IPC  Interrupts IN the PIE
                  //
                  PieCtrlRegs.PIEIER1.bit.INTx13= 1;
                  //
                  // Enable CPU INT13 which is connected to Timer1 interrupt:
                  //
                      IER |= M_INT13;
                      EINT;
    
                   //
                   //enable timer1 interrupts IN PIE
                   //
                     PieCtrlRegs.PIEIER1.bit.INTx7=1;
                   //
                   // Enable CPU INT7 which is connected to Timer1 interrupt:
                  //
                       IER |= M_INT7;
                       EINT;
    
    
               //
               // Enable SPIA_RX,SPIA_TX __interrupt 1,2 in the PIE: Group 6 __interrupt 1,2 table page 102 manul
               //
                      PieCtrlRegs.PIEIER6.bit.INTx1=1;
                      PieCtrlRegs.PIEIER6.bit.INTx2=1;
              //
              // Enable CPU INT6 which is connected to PIE group 6
              //
                  IER |= M_INT6;
                  EINT; // Enable Global interrupt INTM
                  ERTM;  // Enable Global realtime interrupt DBGM
         //
         //SPI initialization
        //
           spi_fifo_init();
        //
        //timer0 initialization
        //
        Ini_timer0();
    
        //
        //wait here until CPU2 is ready
        //
        while(IpcRegs.IPCSTS.bit.IPC17 != 1)
           {
           }
           IpcRegs.IPCACK.bit.IPC17 = 1;
       //
       // set CurrentMsgPtrW as the message output structure defined in 81 to 86
       //
        CurrentMsgPtrW= &SPI_Msgout;
        //
        // set I2C_IF_DIS bit to '1' in the USER_CTRL register,
        // to disable I2C and work with SPI
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_USER_CTRL;
        CurrentMsgPtrW->outMsg=0x10;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
        //
        // Auto selects the best available clock source,
        // else use the Internal oscillator 20 MHZ
        //
        CurrentMsgPtrW->MPU9250_Reg=MPU9250_PWR_MGMT_1;
        CurrentMsgPtrW->outMsg=0x01;
        FailCount= SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_INT_PIN_CFG;
        CurrentMsgPtrW->outMsg=0x02;
        FailCount= SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
        //
        // set the SMPLRT_DIV to 7 that mean the sample rate = internal sample rate / (7+1)
        // therefore the samplerate will be 10 MHZ/8 = 1.25 MHZ
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_SMPLRT_DIV;
        CurrentMsgPtrW->outMsg=0x07;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
        //
        // Enables the FSYNC pin data to be sampled at the ACCEL_ZOUT_L[0]
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_CONFIG;
        //CurrentMsgPtrW->outMsg=0x3E;
        CurrentMsgPtrW->outMsg=0x06;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
        //
        // set the Bandwidth (Hz) of the digital low pass filter to 5 Hz for the gyro and
        // the 1000 degree per second
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_GYRO_CONFIG;
        CurrentMsgPtrW->outMsg=0x00;
        FailCount= SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
        //
        // Acceleration Full Scale Select to +-2g [4:3]= "00"
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_ACCEL_CONFIG;
        CurrentMsgPtrW->outMsg=0x00;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
    
        //
        // set the Bandwidth (Hz) of the digital low pass filter to 5 HZ for the accelerometer
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_ACCEL_CONFIG2;
        CurrentMsgPtrW->outMsg=0x0E;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
        // SpiaRegs.SPICCR.bit.SPISWRESET = 0;
      //   SpiaRegs.SPIFFTX.all = 0xC021;
        //  SpiaRegs.SPIPRI.bit.FREE = 1;
          //SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
         //SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
         //SpiaRegs.SPICTL.bit.TALK = 1; // Enable Transmit path
         //SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    
        SPI_Msgin.MsgBuffer[0] = 0x0000;
        SPI_Msgin.MsgBuffer[1] = 0x0000;
        SPI_Msgin.MsgBuffer[2] = 0x0000;
        SPI_Msgin.MsgBuffer[3] = 0x0000;
        SPI_Msgin.MsgBuffer[4] = 0x0000;
        SPI_Msgin.MsgBuffer[5] = 0x0000;
        SPI_Msgin.MsgBuffer[6] = 0x0000;
        SPI_Msgin.MsgBuffer[7] = 0x0000;
        SPI_Msgin.MsgBuffer[8] = 0x0000;
        SPI_Msgin.MsgBuffer[9] = 0x0000;
        SPI_Msgin.MsgBuffer[10] = 0x0000;
        SPI_Msgin.MsgBuffer[11] = 0x0000;
    
    /*
        // Clear incoming message buffer
             for (int rr = 0; rr < 12; rr++)
                {SPI_Msgin.MsgBuffer[rr] = 0x0000;}
    */
    
    i=0;k=0;
    
             CpuTimer1Regs.TCR.bit.TRB=1;
             CpuTimer1Regs.TCR.bit.TSS=0;
            //R_UKF.setAngle(0.00); // First set roll starting angle
    
           // P_UKF.setAngle(0.00); // Then pitch
    //f=1;
    
     while(1)
        {
            CpuTimer0Regs.TCR.bit.TRB=1;
            CpuTimer0Regs.TIM.all=0xFFFFFFFF;
            CpuTimer0Regs.TCR.bit.TSS=0;
            tt= CpuTimer0Regs.TIM.all;
    
            CurrentMsgPtr= &SPI_Msgin;
            CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_H;
            SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
            SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
            SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;  // Clear Interrupt flag
            while(f==1)
    {
    switch(i)
    {
    case 0:CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_H;
    f=0;
           break;
    case 1:CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_L;
    f=0;
           break;
    case 2: dx=((CurrentMsgPtr->MsgBuffer[0] << 8) | CurrentMsgPtr->MsgBuffer[1]);
    
            dx=(dx/131)*DEG_RAD;
            in_buffer[0][k]=dx;
            k=k+1;
             go2= 32;
            f=0;
            CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_YOUT_H;
            break;
    case 3: CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_YOUT_L;
    f=0;
            break;
    case 4:  dy=((CurrentMsgPtr->MsgBuffer[2] << 8) | CurrentMsgPtr->MsgBuffer[3]);
             dy=(dy/131)*DEG_RAD;
             in_buffer[1][k1]=dy;
             k1=k1+1;
             f=0;
             CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_ZOUT_H;
             break;
    case 5:  CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_ZOUT_L;
    f=0;
             break;
    case 6: dz=((CurrentMsgPtr->MsgBuffer[4] << 8) | CurrentMsgPtr->MsgBuffer[5]);
            dz=(dz/131)*DEG_RAD;
            in_buffer[2][k2]=dz;
            CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_XOUT_H;
            k2=k2+1;
            f=0;
            break;
    case 7: CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_XOUT_L;
    f=0;
            break;
    case 8: accX=((CurrentMsgPtr->MsgBuffer[6] << 8) | CurrentMsgPtr->MsgBuffer[7]);
            accX=accX;
            in_buffer[3][k3]=accX;
            k3=k3+1;
            f=0;
            CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_YOUT_H;
            break;
    case 9: CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_YOUT_L;
    f=0;
            break;
    case 10: accY=((CurrentMsgPtr->MsgBuffer[8] << 8) | CurrentMsgPtr->MsgBuffer[9]);
             accY=accY;
             in_buffer[4][k4]=accY;
             CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_ZOUT_H;
             k4=k4+1;
             f=0;
             break;
    case 11: CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_ZOUT_L;
    f=0;
            break;
    case 12: accZ=((CurrentMsgPtr->MsgBuffer[10] << 8) | CurrentMsgPtr->MsgBuffer[11]);
    
             accZ=accZ;
             in_buffer[5][k5]=accZ;
             CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_H;
             k5=k5+1;
             i=0;
             f=0;
             break;
    }
    
        }
    
      //Send_sensor_regs= CurrentMsgPtr->sensor_Reg; //  transmits data
    //  while(SpiaRegs.SPIFFTX.bit.TXFFST!=1) {}
      SPI_ReadData(CurrentMsgPtr);
      while(SpiaRegs.SPIFFRX.bit.RXFFINT!=1) {}
        //
        // implement average filter
        //
    
        for( j=0;j<20;j++)
        {
          temp1+=in_buffer[0][j];
    
          temp2+=in_buffer[1][j];
    
          temp3+=in_buffer[2][j];
    
          temp4+=in_buffer[3][j];
    
          temp5+=in_buffer[4][j];
    
          temp6+=in_buffer[5][j];
        }
        dx_f=temp1/20;//0.006667
              temp1=0;
        dy_f=(temp2/20);//+0.148;
              temp2=0;
        dz_f=temp3/20;
              temp3=0;
       accX_f=temp4/20;
              temp4=0;
       accY_f=temp5/20;
              temp5=0;
       accZ_f=temp6/20;
              temp6=0;
    
            if(k>=20)
               {k=0;}
            if(k1>=20)
            {k1=0;}
            if(k2>=20)
                {k2=0;}
            if(k3>=20)
                {k3=0;}
            if(k4>=20)
                {k4=0;}
            if(k5>=20)
                {k5=0;}
    
     ACC_A(accX_f,accY_f,accZ_f);
    
           // ACC_A(accX,accY,accZ);
           if ((roll < -1.5708 && KF_roll > 1.5708) || (roll > 1.5708 && KF_roll < -1.5708))
            {
                //kalmanX.setAngle(roll);
                R_UKF.setAngle(roll);
                KF_roll = roll;
    
    
              }
            else
                 // KF_roll = kalmanX.getAngle(roll, dx_f, ts); // Calculate the angle using a Kalman filter
            { KF_roll=R_UKF.EstimatUKF(roll, dx_f, ts);
              AR=KF_roll-0.72;
              cpusend= AR*100;
    
            }
         //  if (abs(KF_roll) > 1.5708)
         //  {  dy_f = -dy_f; }// Invert rate, so it fits the restricted accelerometer reading
         //   KF_pitch = P_UKF.EstimatUKF(pitch, dy_f, ts);
    
    
            ts= 0.00000001*(tt-CpuTimer0Regs.TIM.all);
        }
       }
    
    
    
    void Ini_timer0()
    {
     EALLOW;  // This is needed to write to EALLOW protected registers
         CpuSysRegs.PCLKCR0.bit.CPUTIMER0=1;
         CpuTimer0Regs.TIM.all=0xFFFFFFFF;
         CpuTimer0Regs.PRD.bit.LSW=0xFFFF;
         CpuTimer0Regs.PRD.bit.MSW=0xFFFF;
         CpuTimer0Regs.TCR.bit.TIE=0;
         CpuTimer0Regs.TCR.bit.TIF=1;
         CpuTimer0Regs.TCR.bit.TSS=0;
         CpuTimer0Regs.TCR.bit.TRB=1;
         CpuTimer0Regs.TCR.bit.FREE=1;
         CpuTimer0Regs.TCR.bit.SOFT=0;
         CpuTimer0Regs.TPR.bit.TDDR=0x00;
         CpuTimer0Regs.TPR.bit.PSC=0x0000;
         CpuTimer0Regs.TPRH.bit.TDDRH=0x00;
     EDIS;
    }
    
    
    
    Uint16 SPI_WriteData(struct SPIMsgOut *msg)
    {
        SpiaRegs.SPITXBUF = msg->MPU9250_Reg;
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1)
        SpiaRegs.SPITXBUF =msg->outMsg;// Master transmits data
        return 0;
    }
    
    void SPI_ReadData (struct SPIMsgIn *msg)
    {
        go++;
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;
        SpiaRegs.SPICTL.bit.TALK = 1; // Enable Transmit path
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;
        SpiaRegs.SPITXBUF = msg->sensor_Reg;
       // SpiaRegs.SPITXBUF = msg->sensor_Reg;
        f=1;
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
    
    }
    __interrupt void IPPC0_ISR(void)
    {
    
     IpcRegs.IPCACK.bit.IPC0 =1; // clear IPC flag
    GGG = 15;
    counter2++;
    
     }
    
    
    //
    void ACC_A(double x_dd, double y_dd, double z_dd)
    {
    float ss;
        roll = atan2(y_dd,-z_dd);
        ss=pow(z_dd*z_dd + y_dd*y_dd,0.5);
       // pitch = atan2(x_dd,sqrt(y_dd*y_dd + z_dd*z_dd))/DEG_RAD;
    
        if (y_dd<0)
        {
            pitch=(atan(x_dd/-ss));
        }
        else
        {
            pitch=(atan(x_dd/ss));
        }
        //pitch=pitch/DEG_RAD;
    }
    void spi_fifo_init()
    {
        EALLOW;
                //
                //J2 ....(19"SPICS" ,14"SPISIMO",15"SPI), J1.....(7"SPICLK")  "GPIO 58-61"
                //
                //
                // Enable pull-up on
                //
                GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
                GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
                GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
                GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;
                //
                // Set qualification for selected pins to asynch only
                //
                GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO58 (SPISIMOA)
                GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO59 (SPISOMIA)
                GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO60 (SPICLKA)
                GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO61 (SPISTEA)
    
               //
               //Configure SPI-A pins using GPIO regs
               //
             GpioCtrlRegs.GPBMUX2.bit.GPIO60=3;GpioCtrlRegs.GPBMUX2.bit.GPIO58=3;
             GpioCtrlRegs.GPBMUX2.bit.GPIO61=3;GpioCtrlRegs.GPBMUX2.bit.GPIO59=3;
             GpioCtrlRegs.GPBGMUX2.bit.GPIO60=3;GpioCtrlRegs.GPBGMUX2.bit.GPIO58=3;
             GpioCtrlRegs.GPBGMUX2.bit.GPIO61=3;GpioCtrlRegs.GPBGMUX2.bit.GPIO59=3;
    
             EDIS;
                           //
        //
        // Initialize SPI FIFO registers
        //
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;
        SpiaRegs.SPIFFTX.all = 0xC021;    // Enable FIFOs, set TX FIFO level to 2
        SpiaRegs.SPIFFRX.all = 0x0021;    // Set RX FIFO level to 1
        SpiaRegs.SPIFFCT.all = 0x00;
    
    
    
        //InitSpi();
    
        //
        // Initialize core SPI registers
        //
        // Initialize SPI-A
    
        // Set reset low before configuration changes
        // Clock polarity (0 == rising, 1 == falling)
        // 16-bit character
        // Enable loop-back
    
        SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
        SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
        SpiaRegs.SPICCR.bit.SPILBK = 0;
        ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 0;      // Prescaler - need 7-12 Mhz on module clk
        SpiaRegs.SPICCR.bit.HS_MODE = 1;
        SpiaRegs.SPIBRR.all = 0x67;                    // here it is set to 10 MHZ
        // Enable master (0 == slave, 1 == master)
        // Enable transmission (Talk)
        // Clock phase (0 == normal, 1 == delayed)
        // SPI interrupts are disabled
        SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
        SpiaRegs.SPICTL.bit.TALK = 1;
        SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
        SpiaRegs.SPICTL.bit.SPIINTENA = 0;
    
    
    
        // Set FREE bit
        // Halting on a breakpoint will not halt the SPI
        SpiaRegs.SPIPRI.bit.FREE = 1;
    
        // Release the SPI from reset
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;
        SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
        SpiaRegs.SPIFFTX.bit.TXFIFO=1;
    }
    __interrupt void spiTxFifoIsr(void)
    {
    
    transmit++;
    
    
    
        if(f==1)
        {
            a++;
          // while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Wait until data received
         //  CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
         //  CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
    
         //
    
         //   SpiaRegs.SPICCR.bit.SPISWRESET = 0;
      //  SpiaRegs.SPICTL.bit.TALK = 0; // disable Transmit path
      //  SpiaRegs.SPICCR.bit.SPISWRESET = 1;
        //CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
    
    
    
        if(a>=20)
                  {
                  IpcRegs.IPCSENDDATA =  cpusend; //write the results to IPC data register
                  IpcRegs.IPCSET.bit.IPC1 =1; // set the flag for CPU2
                  a=0;
                  }
        }
      //  while(SpiaRegs.SPIFFRX.bit.RXFFINT!=1) {}
       // SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ACK
    }
    
    //
    // spiRxFifoIsr - ISR for SPI receive FIFO
    //
    
    __interrupt void spiRxFifoIsr(void)
    {
        go2++;
       // SpiaRegs.SPICCR.bit.SPISWRESET = 0;
             //SpiaRegs.SPIFFTX.all = 0xC021;
            // SpiaRegs.SPIPRI.bit.FREE = 1;
            //SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
            //SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
          //  SpiaRegs.SPICTL.bit.TALK = 0; // Enable Transmit path
          //   SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    
        CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
            i=i+1;
    
    
        PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ack
    
    
    }
    
    
     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请注意、您在代码中将 SPI 配置为8位字符、但在读取/写入 SPI 缓冲区时使用 uint16变量。 在8位模式中、SPI 将始终首先移出 SPITXBUF 的 MSB。 可能是您的命令/消息被切断了吗?  

    SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
    
    struct SPIMsgIn {
    Uint16 sensor_Reg;
    int16 MsgBuffer[12];
    };
    
    struct SPIMsgOut {
    Uint16 MPU9250_Reg;
    Uint16 outMsg;
    };

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将其设置为8位、因为我 从 IMU 的寄存器接收到8位、例如、 MPU9250_ACCEL_XOUT_H 和 MPU9250_ACCEL_XOUT_L 实际上、我对 I2C 使用了 ane 方法、它可以正常工作。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在8位模式下、您需要在写入 SPI 缓冲寄存器时将数据移位<8。 这是 SPI 模块的一项独特要求。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我试图移动发送数据<<8,但它变成了最糟的事情。 它停止读取任何数据。 另一方面、不会对我正在接收和发送的位进行移位、但问题是、接收缓冲区的值是固定的。 我将随附一段视频、展示 SPIRXBUF 如何接收数据、但无论我如何移动 IMU 传感器、此数据都不会改变。

    e2e.ti.com/.../WhatsApp-Video-2023_2D00_03_2D00_28-at-1.44.36-PM.mp4

    #include "F28x_Project.h"
    #include <math.h>
    //#include"KF.h"
    #include "UKF_IMU.h"
    #include "F28x_Project.h"
    #include "F2837xD_Ipc_drivers.h"
    //
    //SPI connected with MPU9250 "IMU"
    //
    
    
    //
    // define the address of each register from the MPU-9250 Register Map and Descriptions Revision 1.6.pdf
    //
    #define MPU9250_SMPLRT_DIV     0x19
    #define MPU9250_INT_PIN_CFG    0x37
    #define MPU9250_CONFIG         0x1A
    #define MPU9250_GYRO_CONFIG    0x1B
    #define MPU9250_ACCEL_CONFIG   0x1C
    #define MPU9250_ACCEL_CONFIG2  0x1D
    
    #define MPU9250_ACCEL_XOUT_H   0x3B
    #define MPU9250_ACCEL_XOUT_L   0x3C
    #define MPU9250_ACCEL_YOUT_H   0x3D
    #define MPU9250_ACCEL_YOUT_L   0x3E
    #define MPU9250_ACCEL_ZOUT_H   0x3F
    #define MPU9250_ACCEL_ZOUT_L   0x40
    
    #define MPU9250_GYRO_XOUT_H    0x43
    #define MPU9250_GYRO_XOUT_L    0x44
    #define MPU9250_GYRO_YOUT_H    0x45
    #define MPU9250_GYRO_YOUT_L    0x46
    #define MPU9250_GYRO_ZOUT_H    0x47
    #define MPU9250_GYRO_ZOUT_L    0x48
    
    #define MPU9250_USER_CTRL      0x6A
    #define MPU9250_PWR_MGMT_1     0x6B
    
    #define DEG_RAD 0.017453292
    
    //
    // function to initialize timer0
    //
    void Ini_timer0(void);
    //
    // function to initialize SPI peripheral
    //
    void spi_fifo_init(void);
    //
    // reading the Accelerometer data
    //
    void ACC_A(double x_dd, double y_dd, double z_dd);
    
    //
    // interrupt function of SPI
    //
    __interrupt void spiTxFifoIsr(void);
    __interrupt void spiRxFifoIsr(void);
    //
    // interrupt function to store data
    //
    __interrupt void IPPC0_ISR(void);
    
    Uint16 FailCount;
    Uint16 Send_sensor_regs,Ind;
    //
    // Function Prototypes
    //
    
    
    struct SPIMsgIn {
                       Uint16 sensor_Reg;
                       int16 MsgBuffer[12];
    };
    
    struct SPIMsgOut {
                        Uint16 MPU9250_Reg;
                        Uint16 outMsg;
    };
    struct SPIMsgIn *CurrentMsgPtr;
    struct SPIMsgOut *CurrentMsgPtrW;
    Uint16 SPI_WriteData(struct SPIMsgOut *msg);
    void SPI_ReadData(struct SPIMsgIn *msg);
    
    int i,j,k,k1,k2,k3,k4,k5,a,f;
    double dx,dy,dz,accX,accY,accZ;
    double dx_f,dy_f,dz_f,accX_f,accY_f,accZ_f,tt,ts;
    double in_buffer[6][20];
    double temp1,temp2,temp3,temp4,temp5,temp6;
    double roll,pitch,KF_roll,KF_pitch,AR;
    int GGG, counter2;
    int go;
    int go2;
    int transmit;
    Uint32 cpusend;
    
    UKF R_UKF,P_UKF;
    
    
    void main(void)
       {
    
    
        struct SPIMsgIn   SPI_Msgin;
        struct SPIMsgOut  SPI_Msgout;
    
          //
          // Initialize System Control:
          //
          InitSysCtrl();
          //
          // initialize GPIO
          //
          InitGpio();
    
    
          //
          // connect SCIB with CPU2 for Bluetooth connection
          //
          EALLOW;
          DevCfgRegs.CPUSEL5.bit.SCI_B =1;
          EDIS;
    
        //
        // Give CPU2 Control of the GPIO19 and GPIO18
        //
          GPIO_SetupPinMux(19, GPIO_MUX_CPU2, 2);
          GPIO_SetupPinOptions(19, GPIO_INPUT, GPIO_PUSHPULL);
          GPIO_SetupPinMux(18, GPIO_MUX_CPU2, 2);
          GPIO_SetupPinOptions(18, GPIO_OUTPUT, GPIO_ASYNC);
        //
        //Clear all interrupts and initialize PIE vector table:
        //
        DINT;
        //
        // Initialize PIE control registers to their default state.
        //
        InitPieCtrl();
    
    
        //
        // Disable CPU interrupts and clear all CPU interrupt flags:
        //
        IER |= 0x0000;
        IFR=0x0000;
        //
        //clear the IPC flag
        //
        IpcRegs.IPCCLR.bit.IPC0= 1;
        //
        //clears it and allows another interrupt from the corresponding group to propagate
        // it is not important here as after after every single interrupt function
        //
       // PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
       // PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;
        //PieCtrlRegs.PIEACK.all = 0x0061;
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR)
        //
        InitPieVectTable();
        //
        // Interrupts that are used in this example are re-mapped to
        // ISR functions found within this file.
        //
        EALLOW;    // This is needed to write to EALLOW protected registers
        PieVectTable.IPC0_INT = &IPPC0_ISR;    // assign interrupt function of IPC0
        PieVectTable.SPIA_RX_INT = &spiRxFifoIsr;//assign interrupt function of SPIA RX
        PieVectTable.SPIA_TX_INT = &spiTxFifoIsr;//assign interrupt function of SPIA TX
        EDIS;      // This is needed to disable write to EALLOW protected registers
                //
                //Enable vector fetching from ePIE block. This bit must be set to 1 for peripheral interrupts to work.
                //
                  EALLOW;
                  PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
                  IER |= M_INT1;
                  EINT;
                  EDIS;
    
                  //
                  //clear IPC flags
                  //
                  IpcRegs.IPCCLR.all= 0xFFFFFFFF;
                  //
                  //enable IPC  Interrupts IN the PIE
                  //
                  PieCtrlRegs.PIEIER1.bit.INTx13= 1;
                  //
                  // Enable CPU INT13 which is connected to Timer1 interrupt:
                  //
                      IER |= M_INT13;
                      EINT;
    
                   //
                   //enable timer1 interrupts IN PIE
                   //
                     PieCtrlRegs.PIEIER1.bit.INTx7=1;
                   //
                   // Enable CPU INT7 which is connected to Timer1 interrupt:
                  //
                       IER |= M_INT7;
                       EINT;
    
    
               //
               // Enable SPIA_RX,SPIA_TX __interrupt 1,2 in the PIE: Group 6 __interrupt 1,2 table page 102 manul
               //
                      PieCtrlRegs.PIEIER6.bit.INTx1=1;
                      PieCtrlRegs.PIEIER6.bit.INTx2=1;
              //
              // Enable CPU INT6 which is connected to PIE group 6
              //
                  IER |= M_INT6;
                  EINT; // Enable Global interrupt INTM
                  ERTM;  // Enable Global realtime interrupt DBGM
         //
         //SPI initialization
        //
           spi_fifo_init();
        //
        //timer0 initialization
        //
        Ini_timer0();
    
        //
        //wait here until CPU2 is ready
        //
        while(IpcRegs.IPCSTS.bit.IPC17 != 1)
           {
           }
           IpcRegs.IPCACK.bit.IPC17 = 1;
       //
       // set CurrentMsgPtrW as the message output structure defined in 81 to 86
       //
        CurrentMsgPtrW= &SPI_Msgout;
        //
        // set I2C_IF_DIS bit to '1' in the USER_CTRL register,
        // to disable I2C and work with SPI
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_USER_CTRL;
        CurrentMsgPtrW->outMsg=0x10;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
        //
        // Auto selects the best available clock source,
        // else use the Internal oscillator 20 MHZ
        //
        CurrentMsgPtrW->MPU9250_Reg=MPU9250_PWR_MGMT_1;
        CurrentMsgPtrW->outMsg=0x01;
        FailCount= SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_INT_PIN_CFG;
        CurrentMsgPtrW->outMsg=0x02;
        FailCount= SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
        //
        // set the SMPLRT_DIV to 7 that mean the sample rate = internal sample rate / (7+1)
        // therefore the samplerate will be 10 MHZ/8 = 1.25 MHZ
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_SMPLRT_DIV;
        CurrentMsgPtrW->outMsg=0x07;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
        //
        // Enables the FSYNC pin data to be sampled at the ACCEL_ZOUT_L[0]
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_CONFIG;
        //CurrentMsgPtrW->outMsg=0x3E;
        CurrentMsgPtrW->outMsg=0x06;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
        //
        // set the Bandwidth (Hz) of the digital low pass filter to 5 Hz for the gyro and
        // the 1000 degree per second
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_GYRO_CONFIG;
        CurrentMsgPtrW->outMsg=0x00;
        FailCount= SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
        //
        // Acceleration Full Scale Select to +-2g [4:3]= "00"
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_ACCEL_CONFIG;
        CurrentMsgPtrW->outMsg=0x00;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
    
        //
        // set the Bandwidth (Hz) of the digital low pass filter to 5 HZ for the accelerometer
        //
        CurrentMsgPtrW->MPU9250_Reg= MPU9250_ACCEL_CONFIG2;
        CurrentMsgPtrW->outMsg=0x0E;
        FailCount=SPI_WriteData(CurrentMsgPtrW);
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
        // SpiaRegs.SPICCR.bit.SPISWRESET = 0;
      //   SpiaRegs.SPIFFTX.all = 0xC021;
        //  SpiaRegs.SPIPRI.bit.FREE = 1;
          //SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
         //SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
         //SpiaRegs.SPICTL.bit.TALK = 1; // Enable Transmit path
         //SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    
      //  SPI_Msgin.MsgBuffer[0] = 0x0000;
      //  SPI_Msgin.MsgBuffer[1] = 0x0000;
      //  SPI_Msgin.MsgBuffer[2] = 0x0000;
      //  SPI_Msgin.MsgBuffer[3] = 0x0000;
      //  SPI_Msgin.MsgBuffer[4] = 0x0000;
      //  SPI_Msgin.MsgBuffer[5] = 0x0000;
      //  SPI_Msgin.MsgBuffer[6] = 0x0000;
      //  SPI_Msgin.MsgBuffer[7] = 0x0000;
      //  SPI_Msgin.MsgBuffer[8] = 0x0000;
      //  SPI_Msgin.MsgBuffer[9] = 0x0000;
      //  SPI_Msgin.MsgBuffer[10] = 0x0000;
      //  SPI_Msgin.MsgBuffer[11] = 0x0000;
    
    
        // Clear incoming message buffer
             for (int rr = 0; rr < 12; rr++)
                {SPI_Msgin.MsgBuffer[rr] = 0x0000;}
    
    
    i=0;k=0;
    
             CpuTimer1Regs.TCR.bit.TRB=1;
             CpuTimer1Regs.TCR.bit.TSS=0;
            //R_UKF.setAngle(0.00); // First set roll starting angle
    
           // P_UKF.setAngle(0.00); // Then pitch
    //f=1;
    
     while(1)
        {
            CpuTimer0Regs.TCR.bit.TRB=1;
            CpuTimer0Regs.TIM.all=0xFFFFFFFF;
            CpuTimer0Regs.TCR.bit.TSS=0;
            tt= CpuTimer0Regs.TIM.all;
    
            CurrentMsgPtr= &SPI_Msgin;
            CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_H;
            SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
            SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
            SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;  // Clear Interrupt flag
            while(f==1)
    {
    switch(i)
    {
    case 0:CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_H;
    f=0;
           break;
    case 1:CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_L;
    f=0;
           break;
    case 2: dx=((CurrentMsgPtr->MsgBuffer[0] << 8) | CurrentMsgPtr->MsgBuffer[1]);
    
            dx=(dx/131)*DEG_RAD;
            in_buffer[0][k]=dx;
            k=k+1;
             go2= 32;
            f=0;
            CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_YOUT_H;
            break;
    case 3: CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_YOUT_L;
    f=0;
            break;
    case 4:  dy=((CurrentMsgPtr->MsgBuffer[2] << 8) | CurrentMsgPtr->MsgBuffer[3]);
             dy=(dy/131)*DEG_RAD;
             in_buffer[1][k1]=dy;
             k1=k1+1;
             f=0;
             CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_ZOUT_H;
             break;
    case 5:  CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_ZOUT_L;
    f=0;
             break;
    case 6: dz=((CurrentMsgPtr->MsgBuffer[4] << 8) | CurrentMsgPtr->MsgBuffer[5]);
            dz=(dz/131)*DEG_RAD;
            in_buffer[2][k2]=dz;
            CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_XOUT_H;
            k2=k2+1;
            f=0;
            break;
    case 7: CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_XOUT_L;
    f=0;
            break;
    case 8: accX=((CurrentMsgPtr->MsgBuffer[6] << 8) | CurrentMsgPtr->MsgBuffer[7]);
            accX=accX;
            in_buffer[3][k3]=accX;
            k3=k3+1;
            f=0;
            CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_YOUT_H;
            break;
    case 9: CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_YOUT_L;
    f=0;
            break;
    case 10: accY=((CurrentMsgPtr->MsgBuffer[8] << 8) | CurrentMsgPtr->MsgBuffer[9]);
             accY=accY;
             in_buffer[4][k4]=accY;
             CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_ZOUT_H;
             k4=k4+1;
             f=0;
             break;
    case 11: CurrentMsgPtr->sensor_Reg=MPU9250_ACCEL_ZOUT_L;
    f=0;
            break;
    case 12: accZ=((CurrentMsgPtr->MsgBuffer[10] << 8) | CurrentMsgPtr->MsgBuffer[11]);
    
             accZ=accZ;
             in_buffer[5][k5]=accZ;
             CurrentMsgPtr->sensor_Reg=MPU9250_GYRO_XOUT_H;
             k5=k5+1;
             i=0;
             f=0;
             break;
    }
    
        }
    
      //Send_sensor_regs= CurrentMsgPtr->sensor_Reg; //  transmits data
    //  while(SpiaRegs.SPIFFTX.bit.TXFFST!=1) {}
      SPI_ReadData(CurrentMsgPtr);
      while(SpiaRegs.SPIFFRX.bit.RXFFINT!=1) {}
        //
        // implement average filter
        //
    
        for( j=0;j<20;j++)
        {
          temp1+=in_buffer[0][j];
    
          temp2+=in_buffer[1][j];
    
          temp3+=in_buffer[2][j];
    
          temp4+=in_buffer[3][j];
    
          temp5+=in_buffer[4][j];
    
          temp6+=in_buffer[5][j];
        }
        dx_f=temp1/20;//0.006667
              temp1=0;
        dy_f=(temp2/20);//+0.148;
              temp2=0;
        dz_f=temp3/20;
              temp3=0;
       accX_f=temp4/20;
              temp4=0;
       accY_f=temp5/20;
              temp5=0;
       accZ_f=temp6/20;
              temp6=0;
    
            if(k>=20)
               {k=0;}
            if(k1>=20)
            {k1=0;}
            if(k2>=20)
                {k2=0;}
            if(k3>=20)
                {k3=0;}
            if(k4>=20)
                {k4=0;}
            if(k5>=20)
                {k5=0;}
    
     ACC_A(accX_f,accY_f,accZ_f);
    
           // ACC_A(accX,accY,accZ);
           if ((roll < -1.5708 && KF_roll > 1.5708) || (roll > 1.5708 && KF_roll < -1.5708))
            {
                //kalmanX.setAngle(roll);
                R_UKF.setAngle(roll);
                KF_roll = roll;
    
    
              }
            else
                 // KF_roll = kalmanX.getAngle(roll, dx_f, ts); // Calculate the angle using a Kalman filter
            { KF_roll=R_UKF.EstimatUKF(roll, dx_f, ts);
              AR=KF_roll-0.72;
              cpusend= AR*100;
    
            }
         //  if (abs(KF_roll) > 1.5708)
         //  {  dy_f = -dy_f; }// Invert rate, so it fits the restricted accelerometer reading
         //   KF_pitch = P_UKF.EstimatUKF(pitch, dy_f, ts);
    
    
            ts= 0.00000001*(tt-CpuTimer0Regs.TIM.all);
        }
       }
    
    
    
    void Ini_timer0()
    {
     EALLOW;  // This is needed to write to EALLOW protected registers
         CpuSysRegs.PCLKCR0.bit.CPUTIMER0=1;
         CpuTimer0Regs.TIM.all=0xFFFFFFFF;
         CpuTimer0Regs.PRD.bit.LSW=0xFFFF;
         CpuTimer0Regs.PRD.bit.MSW=0xFFFF;
         CpuTimer0Regs.TCR.bit.TIE=0;
         CpuTimer0Regs.TCR.bit.TIF=1;
         CpuTimer0Regs.TCR.bit.TSS=0;
         CpuTimer0Regs.TCR.bit.TRB=1;
         CpuTimer0Regs.TCR.bit.FREE=1;
         CpuTimer0Regs.TCR.bit.SOFT=0;
         CpuTimer0Regs.TPR.bit.TDDR=0x00;
         CpuTimer0Regs.TPR.bit.PSC=0x0000;
         CpuTimer0Regs.TPRH.bit.TDDRH=0x00;
     EDIS;
    }
    
    
    
    Uint16 SPI_WriteData(struct SPIMsgOut *msg)
    {
        SpiaRegs.SPITXBUF = msg->MPU9250_Reg;
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1)
        SpiaRegs.SPITXBUF =msg->outMsg;// Master transmits data
        return 0;
    }
    
    void SPI_ReadData (struct SPIMsgIn *msg)
    {
        go++;
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;
        SpiaRegs.SPICTL.bit.TALK = 1; // Enable Transmit path
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;
        SpiaRegs.SPITXBUF = msg->sensor_Reg;
       // SpiaRegs.SPITXBUF = msg->sensor_Reg;
        f=1;
        while(SpiaRegs.SPIFFTX.bit.TXFFINT!=1) {}
    
    
    
    }
    __interrupt void IPPC0_ISR(void)
    {
    
     IpcRegs.IPCACK.bit.IPC0 =1; // clear IPC flag
    GGG = 15;
    counter2++;
    
     }
    
    
    //
    void ACC_A(double x_dd, double y_dd, double z_dd)
    {
    float ss;
        roll = atan2(y_dd,-z_dd);
        ss=pow(z_dd*z_dd + y_dd*y_dd,0.5);
       // pitch = atan2(x_dd,sqrt(y_dd*y_dd + z_dd*z_dd))/DEG_RAD;
    
        if (y_dd<0)
        {
            pitch=(atan(x_dd/-ss));
        }
        else
        {
            pitch=(atan(x_dd/ss));
        }
        //pitch=pitch/DEG_RAD;
    }
    void spi_fifo_init()
    {
        EALLOW;
                //
                //J2 ....(19"SPICS" ,14"SPISIMO",15"SPI), J1.....(7"SPICLK")  "GPIO 58-61"
                //
                //
                // Enable pull-up on
                //
                GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
                GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
                GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
                GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;
                //
                // Set qualification for selected pins to asynch only
                //
                GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO58 (SPISIMOA)
                GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO59 (SPISOMIA)
                GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO60 (SPICLKA)
                GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO61 (SPISTEA)
    
               //
               //Configure SPI-A pins using GPIO regs
               //
             GpioCtrlRegs.GPBMUX2.bit.GPIO60=3;GpioCtrlRegs.GPBMUX2.bit.GPIO58=3;
             GpioCtrlRegs.GPBMUX2.bit.GPIO61=3;GpioCtrlRegs.GPBMUX2.bit.GPIO59=3;
             GpioCtrlRegs.GPBGMUX2.bit.GPIO60=3;GpioCtrlRegs.GPBGMUX2.bit.GPIO58=3;
             GpioCtrlRegs.GPBGMUX2.bit.GPIO61=3;GpioCtrlRegs.GPBGMUX2.bit.GPIO59=3;
    
             EDIS;
                           //
        //
        // Initialize SPI FIFO registers
        //
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;
        SpiaRegs.SPIFFTX.all = 0xC021;    // Enable FIFOs, set TX FIFO level to 2
        SpiaRegs.SPIFFRX.all = 0x0021;    // Set RX FIFO level to 1
        SpiaRegs.SPIFFCT.all = 0x00;
    
    
    
        //InitSpi();
    
        //
        // Initialize core SPI registers
        //
        // Initialize SPI-A
    
        // Set reset low before configuration changes
        // Clock polarity (0 == rising, 1 == falling)
        // 16-bit character
        // Enable loop-back
    
        SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
        SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
        SpiaRegs.SPICCR.bit.SPILBK = 0;
        ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 2;      // Prescaler - need 7-12 Mhz on module clk
        SpiaRegs.SPICCR.bit.HS_MODE = 1;
        SpiaRegs.SPIBRR.all = 0x71;                    // here it is set to 10 MHZ
        // Enable master (0 == slave, 1 == master)
        // Enable transmission (Talk)
        // Clock phase (0 == normal, 1 == delayed)
        // SPI interrupts are disabled
        SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
        SpiaRegs.SPICTL.bit.TALK = 1;
        SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
        SpiaRegs.SPICTL.bit.SPIINTENA = 0;
    
    
    
        // Set FREE bit
        // Halting on a breakpoint will not halt the SPI
        SpiaRegs.SPIPRI.bit.FREE = 1;
    
        // Release the SPI from reset
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;
        SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
        SpiaRegs.SPIFFTX.bit.TXFIFO=1;
    }
    __interrupt void spiTxFifoIsr(void)
    {
    
    transmit++;
    
    
    
        if(f==1)
        {
            a++;
          // while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Wait until data received
         //  CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
         //  CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
    
         //
    
         //   SpiaRegs.SPICCR.bit.SPISWRESET = 0;
      //  SpiaRegs.SPICTL.bit.TALK = 0; // disable Transmit path
      //  SpiaRegs.SPICCR.bit.SPISWRESET = 1;
        //CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
    
    
    
        if(a>=20)
                  {
                  IpcRegs.IPCSENDDATA =  cpusend; //write the results to IPC data register
                  IpcRegs.IPCSET.bit.IPC1 =1; // set the flag for CPU2
                  a=0;
                  }
        }
      //  while(SpiaRegs.SPIFFRX.bit.RXFFINT!=1) {}
       // SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ACK
    }
    
    //
    // spiRxFifoIsr - ISR for SPI receive FIFO
    //
    
    __interrupt void spiRxFifoIsr(void)
    {
        go2++;
       // SpiaRegs.SPICCR.bit.SPISWRESET = 0;
             //SpiaRegs.SPIFFTX.all = 0xC021;
            // SpiaRegs.SPIPRI.bit.FREE = 1;
            //SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
            //SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word length
          //  SpiaRegs.SPICTL.bit.TALK = 0; // Enable Transmit path
          //   SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    
        CurrentMsgPtr->MsgBuffer[i]=SpiaRegs.SPIRXBUF;
            i=i+1;
    
    
        PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ack
    
    
    }
    
    

    e2e.ti.com/.../WhatsApp-Video-2023_2D00_03_2D00_28-at-1.44.36-PM.mp4

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    浏览 MPU-9250数据表时、似乎需要在整个读取或写入事务期间将 CS 线保持为低电平。 您是否验证过 MCU 引脚上确实发生了这种情况? 可以使用 SPISTE 引脚执行此操作、但  您必须确保始终向 SPI FIFO 加载数据 。 在代码中、我看到您写入寄存器、轮询 SPI 状态、然后写入数据。 这可能意味着 CS 线在两个8位值之间变为高电平。 由于使用的是8位模式、因此在写入 SPI 缓冲区之前、您绝对需要移位这些值<8。

    您拥有的产品:

    UINT16 SPI_WriteData (结构 SPIMsgOut * msg)

    SpiaRegs.SPITXBUF = msg->MPU9250_Reg;
    while (SpiaRegs.SPIFFTX.bit.TXFFINT!=1)
    SpiaRegs.SPITXBUF =msg->outMsg;//主器件传输数据
    返回0;
    }

    此代码中是否存在拼写错误? 不确定是否意味着 while 循环可能会根据条件被困在这里写入 SPITXBUF。

    我会做什么:

    UINT16 SPI_WriteData (结构 SPIMsgOut * msg)

    while (SpiaRegs.SPIFFTX.bit.TXFFST!=0){;} //等待 TX FIFO 为空

    SpiaRegs.SPITXBUF = msg->MPU9250_Reg<<8;
    SpiaRegs.SPITXBUF =msg->outMsg<<8;// 背靠背对 TXBUF 的写入将确保 CS 线路在两个字节内保持低电平


    返回0;
    }

    您拥有的产品:

    空 SPI_ReadData (结构 SPIMsgIn *msg)

    GO++;
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    SpiaRegs.SPICTL.bit.talk = 1;//启用发送路径
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    SpiaRegs.SPITXBUF = msg->SENSOR_Reg;
    // SpiaRegs.SPITXBUF = msg->SENSOR_Reg;
    F=1;
    while (SpiaRegs.SPIFFTX.bit.TXFFINT!=1){}

    }

    我会做什么:

    空 SPI_ReadData (结构 SPIMsgIn *msg)

    SpiaRegs.SPIFFRX.bit.RXFIFORESET=0;//复位 RX FIFO 指针(清除任何旧数据)
    SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;// 重新启用 RX FIFO

    while (SpiaRegs.SPIFFRX.bit.RXFFST!=0){;} //此处设置陷阱、以防 RX FIFO 指针未复位

    while (SpiaRegs.SPIFFTX.bit.TXFFST!=0){;} //等待 TX FIFO 为空
    SpiaRegs.SPITXBUF = msg->SENSOR_Reg<<8;
    SpiaRegs.SPITXBUF = 0x00;//假写入以生成时钟


    while (SpiaRegs.SPIFFRX.bit.RXFFST!=2){;}//等待接收2个数据字节

    MSG->MsgBuffer[0]=  SpiaRegs.SPIRXBUF; //这是在 msg->SENSOR_Reg xmit (丢弃)期间接收到的数据
    MSG->MsgBuffer[0]=  SpiaRegs.SPIRXBUF; //这是在虚拟数据传递(保存)期间接收到的真实数据

    }

    如果您要读取多个字节、则应相应地修改上面的代码。  

    注意:我写得很快、我不保证代码会编译或将与  MPU-9250一起使用。 我想先给大家一些介绍。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、

    您有以下 SPI 配置:

    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;

    这将产生:

    这意味着数据在 SPICLK 的上升沿转换并在 SPICLK 的下降沿锁存。

    根据  MPU-9250数据表、这不是您需要的。

    我认为您需要极性= 0和相位= 1。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gus Martinez:

    首先、我要感谢您抽出宝贵的时间参与培训。 第二、我根据大家的建议修改了代码。 但是、它不起作用、因为 SPIRXBUF 停止接收任何值。

    e2e.ti.com/.../WhatsApp-Video-2023_2D00_03_2D00_29-at-8.15.07-AM.mp4

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了帮助您、我需要更多调试信息。 ]我们需要确定 SPI 引脚是否按预期切换。 我还建议您首先尝试一些简单的方法、比如读取传感器中的某个 ID 寄存器。  在此简单事务期间、您是否能够使用示波器探测 SPI 引脚?