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

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使用

Eric Ma:

xiaoliang,

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

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

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

Eric

 

我需要通过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 jiang:

回复 Eric Ma:

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;}

我需要通过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 jiang:

回复 Eric Ma:

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

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28335 SPI扩串口(1扩4)
分享到: 更多 (0)