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.

TMS320F28335 SPI扩串口(1扩4)



我需要通过read_reg()读取VK3224(扩展芯片)寄存器的值,但是在接收中断处理时,接收FIFO中会有好几个数据,导致读取出来的是错误数据,

unsigned char send(unsigned char data1,unsigned char data2)
{
unsigned int temp1, i;
unsigned char temp2;
temp1 = data1 * 256 + data2;
SpiaRegs.SPITXBUF=temp1;
while(SpiaRegs.SPIFFRX.bit.RXFFST <= 0);
temp2 = SpiaRegs.SPIRXBUF & 0xff;
return temp2;
}  函数中发送一个数据立即就读取,照理FIFO中应该只有当前返回的一个数据。 求指教28335 SPI使用

  • xiaoliang,

    while(SpiaRegs.SPIFFRX.bit.RXFFST <= 0);
    temp2 = SpiaRegs.SPIRXBUF & 0xff;

    你这个函数里面采用查询方式读取FIFO的值,而且还只读到一个数据,这会不会跟你的接收中断产生冲突。

    另外最好说明一下VK3224会回送什么数据。否则很难判断数据到底再哪里出现问题。

    Eric

     

  • unsigned char read(unsigned char data1,unsigned char data2) //读,中间还有一个调用,我就省略了
    {
    unsigned short temp1;
    unsigned char temp2, temp;
    temp1 = data1 * 256 + data2;
    SpiaRegs.SPITXBUF=temp1;
    while(SpiaRegs.SPIFFRX.bit.RXFFST == 0);
    temp2 = SpiaRegs.SPIRXBUF & 0xff;
    return temp2;
    }

    void write(unsigned char data1,unsigned char data2)  //写, 与读一样,省略了部分
    {
    unsigned short temp1, i;
    temp1 = data1 * 256 + data2;
    SpiaRegs.SPITXBUF=temp1;
    }

    我的读和写是分开的,28335 的SPI没有开中断,只是维肯3224的中断连在28335的IO上,使用28335的外部中断。VK3224的每个通道也是16级接收FIFO和16级发送FIFO。对于VK3224的读,我使用中断方式,写就在主程序里面不断调用。

    写操作如下:

    void WIRITE_TO_VK3224(void) //写给3224的通道1
    {
    while( SpiaRegs.SPIFFTX.bit.TXFFST < 14 && m_ucDataPart < m_ucDataNum)
    {
    write_reg(1, SFDR, SndDataBuf[m_ucDataPart++]); //1:通道号,SFDR:VK3224的数据寄存器

    if(m_ucDataPart >= m_ucDataNum)
    {
    m_ucDataPart = 0;
    }
    }

    interrupt void XINT3_VK3224(void)  //中断方式读
    {
    unsigned int i, j;
    unsigned char TEMP2, TEMP1;
    unsigned char Flag_ISR, Flag_TS, temp, temp1, temp2, temp3, TEMP3;
    while(SpiaRegs.SPIFFTX.bit.TXFFST != 0);      //先等待发送FIFO发送完,因为我需要在下面的程序中,立即获得VK寄存器返回值,所以等待。但是好像清空了发送FIFO,但是SpiaRegs.SPITXBUF的数据是没法清空的,所以我在读GIR寄存器的时候,读取了两次,去第二次的值,这时候实际上返回值是第一次读取GIR的值,出现了一个数据的移位
    while(SpiaRegs.SPIFFRX.bit.RXFFST > 0)      //将接受FIFO清空,主程序写的时候没有读取28335的接受FIFO的,也是为了获得VK寄存器返回值,所以清空
    {
    temp = SpiaRegs.SPIRXBUF;
    }


    TEMP1 = read_reg(1, GIR);                                //读取VK的中断寄存器,获取是哪个通道有中断
    temp1 = TEMP1 & 0x01;
    TEMP2 = read_reg(1, GIR);
    temp2 = TEMP2 & 0x01;
    Flag_ISR = temp2;
    if(Flag_ISR)
    {
       for(i = 0; i <= 14; i++)
      {
        if(i == 0)
        temp = read_reg(1, SFDR) & 0xff;
        else
        {
         RcvDataBuf[i] = read_reg(1, SFDR) & 0xff;
        }
      }
    }


    else  //避免读取数据出错,而不处理中断数据 
    {

    for(i = 0; i <= 14; i++)
    {
    if(i == 0)
    temp = read_reg(1, SFDR) & 0xff;
    else
    {
    RcvDataBuf[i] = read_reg(1, SFDR) & 0xff;
    }
    }
    }
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
    }

  • 这是我的联系电话:15195948658 ,急求,如果可以,希望你能联系我