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.
工具/软件:Code Composer Studio
您好!
我正在从事 TMS320F28377和第三方嵌入式硬件之间的 SPI 通信。
目前对 TI 板和第三方硬件之间的浮点编号交换非常感兴趣。 第三方硬件仅具有发送和接收8位(1字节)的限制。
因此、我已经将 float 转换为 char、 我将从 TI 向第三方硬件发送4个字节、我将从第三方硬件向 TI 接收4个字节。
在 TI 端、我在16位 SPIRXBUF 中一个接一个地接收4个字节。 这些字节被覆盖、所以我的问题是如何在 SPIRXBUF 中被覆盖前将其保存一个字节。
可以有人帮助解决此问题吗?
此致、
Narayani
Mark、您好!
我尝试了您建议的解决方案。 我将 SPIFFRX 内容配置为0x0A2A (即 RXFFST 和 RXFFIL 配置为10h、接收 FIFO 有16个字、 这是最大值)、在 RXFIFO ISR 中、我正在读取 SPIRXBUF 4次(可能是我所做的错误)、但仍然无法获得4个字节。
我已禁用 TXFIFO 模式。 一旦我接收到 RXBUF 中的数据,我就会将其发送回 void main()中的第三方硬件。 我在另一侧接收适当的字节。 那么、根据您的建议、我是否需要将 TX 配置为 FIFO 模式? 我随附的代码将使您清楚地了解我的疑虑。
#include "F28x_Project.h"
#include "stdio.h"
uint32 RDATA[2]; //接收数据缓冲区
char *PTR_RDATA; //接收数据缓冲区
uint16 RDATA_POINT; //跟踪我们的位置
字符 res[20];
float n=8.6857;
unsigned char *chptr;
unsigned char *chptr1;
unsigned char *chptr2;
unsigned char *chptr3;
unsigned char *chptr4;
unsigned char arr[4];
unsigned char TempBuf = 0;
uint32 TempBuf1_Rx;
中断 void spiTxFifoIsr (void);
中断空 spiRxFifoIsr (void);
void delay_loop (void);
void SPI_Fifo_init (void);
void error();
void main (void)
{
uint16 i;
InitSysCtrl();
InitSpiaGpio();
Dint;
IER = 0x0000;
IFR = 0x0000;
uint16计数;
InitPieCtrl();
InitPieVectTable();
EALLOW;
PieVectTable.SPIA_RX_INT =&spirxFifoIsr;
PieVectTable.SPIA_TX_INT =&spTxFifoIsr;
EDIS;
SPI_Fifo_init(); //仅初始化 SPI
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER6.bit.INTx1 = 1;
PieCtrlRegs.PIEIER6.bit.INTx2 = 1;
IER = 0x20;
EINT;
for (;;)
{
if (RDATA[0]!= 0)
{
int i=0;
SENSOR[0]=(float) RDATA[0]* 8.6857;
//sensor[0]=(float) RDATA[0]*1;
chptr=(unsigned char *)传感器(sensor);
//字节、按字节传输
while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
TempBuf =((* chptr)& 0x0000);
SpiaRegs.SPITXBUF =(uint16_t) TempBuf;//< 8)& 0xFF00;
delay_loop();
while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
TempBuf =((* chptr)<< 8 & 0x0000);
SpiaRegs.SPITXBUF =(uint16_t) TempBuf;//< 8)& 0xFF00;
//delay_loop();
while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
TempBuf =(*(chptr + 1) & 0x0000);
SpiaRegs.SPITXBUF =(uint16_t) TempBuf;//< 8)& 0xFF00;
//delay_loop();
while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
TempBuf =(*(chptr + 1)<< 8 & 0x0000);
SpiaRegs.SPITXBUF =(uint16_t) TempBuf;//< 8)& 0xFF00;
}
}
}
void delay_loop ()
{
长 I;
对于(i = 0;i < 1000000;i++){}
}
空错误(空)
{
asm (" ESTOP0"); //测试失败!!! 停下来!
适用于(;);
}
void SPI_Fifo_init()
{
SpiaRegs.SPIFFTX.bit.SPIRST = 0;
SpiaRegs.SPIFFTX.ALL = 0x0000;
//SpiaRegs.SPIFFTX.ALL = 0xC022;
SpiaRegs.SPIFFRX.ALL = 0x0A2A;
SpiaRegs.SPIFFRX.bit.RXFFST=A;
SpiaRegs.SPIFFCT.all = 0x00;
//SpiaRegs.SPIFFTX.bit.TXFIFO=1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
SpiaRegs.SPIFFTX.bit.SPIRST = 1;
InitSpi();
}
/*中断 void spiTxFifoIsr (void)
{
uint16 i;
SpiaRegs.SPITXBUF=sdata[0];
for (i=0;i<2;i++)
{
sdata[i]= sdata[i]+5;
}
SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;
PieCtrlRegs.PIEACK.All|=0x20; //
}*/
中断空 spiRxFifoIsr (空)
{
uint16 i=0;
RDATA[0]=((SpiaRegs.SPIRXBUF)& 0x00FF);
chptr1 =(unsigned char *)&RDATA[0];
RDATA[0]=((SpiaRegs.SPIRXBUF)& 0x00FF);
chptr2 =(unsigned char *)&RDATA[0];
RDATA[0]=((SpiaRegs.SPIRXBUF)& 0x00FF);
chptr3 =(unsigned char *)&RDATA[0];
RDATA[0]=((SpiaRegs.SPIRXBUF)& 0x00FF);
chptr4 =(unsigned char *)&RDATA[0];
//SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; //清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; //清除中断标志
PieCtrlRegs.PIEACX.All|=0x20; //发出 PIE ACK
}
谢谢、此致、
Narayani
Mark、您好!
我实际上解决了这个问题。
是的、我的数据流应该看起来像是两个平台之间的浮点数据交换。 当我使用 SPI 通信时、我将浮点转换为4字节字符。
它不是恒定的数据流、它在每个时钟周期中都会发生变化。 我不想回显字节。 在我的案例中、F28377S 是从器件。
现在、我的下一个挑战是、4个字节可以获取00到 FF (0到255)之间的任何值。 我的虚拟字节也可以是0到255之间的任何值。 为了我的目的,我把它当作255。 如果我不发送和接收虚拟字节、我将无法按正确的顺序收集4个字节。 如果序列受到干扰、浮点值将发生变化、这将导致错误。 那么、任何人能不能帮助我如何接收适当的4个字节而不使用任何虚拟字节、或者任何其他想法也会有帮助。 为了更好地理解、我附加代码的虚拟字节条件。
中断空 spiRxFifoIsr (空)
{
RByte =(无符号字符)(SpiaRegs.SPIRXBUF & 0x00FF);
如果(RByte ==255)
cnt1 = 0;
否则(RByte !=255 & cnt1<=3)
{
String2[cnt1]= RByte;//(unsigned char)(SpiaRegs.SPIRXBUF & 0x00FF);
cnt1 = cnt1+1;
}
//SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; //清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; //清除中断标志
PieCtrlRegs.PIEACX.All|=0x20; //发出 PIE ACK
}
在上述条件下、如果除虚拟字节之外的4个字节中的任何一个字节、则该条件失败、如果我忽略该条件、则会干扰 string2[cnt1]数组中的序列。 因此、请建议一些解决方案。 这是 ISR 下的一段代码。 我在以前的帖子中附加的 REST 代码。
提前感谢、
Narayani