请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:TMS320F2812 工具/软件:Code Composer Studio
您好,
我正在尝试在TI DSP和ET1100 (EtherCAT从属控制器)之间建立通信。 当我连续运行代码时,SPI使能引脚没有切换。 当我设置断点时,它会切换。 这是一种非常奇怪的行为。 我不知道这种代码会在哪里出错。 请帮助我了解代码持续运行时,启用引脚未切换(因为ET1100没有回复)的原因是什么。
GPIO和SPI初始化代码如下所示
void InitGpio (void)
{
EALLOW;
IER = 0x0000;
IFR = 0x0000;
//为SPI接口
GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0 = 1启用四个I/O引脚; //从属导入,主输出
GpioMuxRegs.GPFMUX.bit.SPISOMIA_GPIOF1 = 1; //从输出,GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2
= 1; //串行时钟
GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3 = 1; //启用从属传输(同步)
EDIS;
}
void InitSPI(void)
{
EALLOW;
// SPI FIFO寄存器
SpiaRegs.SPICCR.bit.SPISWRESET=0;//重置SPI
SpiRegs.SPICCR.bit.SPICHAR = 0x7;//字符长度=8 SpiaRegs.SPICRAST.CL=
SP1.bit/ SPITICA.SPIRAST.SPIRAST.SPRAST_SPIRAST.SPIRAST.SPIRAST.SPIRAST.SPIRAST.SPIRAST.POL= SPICA.SPIRAST.SPIRAST.SPIRAST.SPIRAST.SPIX.SPICA.POL= SPICA.POL= SPICA.
//主模式
SpiaRegs.SPICTL.bit.CLK_PHASE =0; //添加Clk wrt SPISTEA
SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1; //启用IBInterrupt
//ClkCfgRegs.LOSRR.ALL = 0x1;//
SPX100 = SPX1000 = SP1000状态= SP1000状态= 0;// SP1000 = SP1000状态= SP1000
//波特率= LSPCLK /(SPIBR+1)[LSPCLK=SYSCLK/4,默认=50m]//------------
SpiaRegs.SPIFFTX.all=0xC022; //启用FIFO,重置它们,设置TX FIFO IntLevel =2,TXINT已禁用
SpiaRegs.SPIFFTX.Bit.TXFFIENA =0; //禁用TXFF INT
SpiaRegs.SPIFFRX.all=0x006A; //启用FIFO,重置它们,设置RXFFIL= 10(dec)
SpiRegs.SPIFFRX.bit.RXFFIL = 0x02;
SpiRegs.SPIFFRX.bit.RXFFIENA = 0;// 禁用RXFF INT
//------------
SpiaRegs.SPIFFCT.ALL=0x00; // FFTXDLY =0 (延迟btw Tx传输)
SPIPREGs.SPIPRI.ALL=0x0020; //在EmuStop SpaRegs.SPICCR.Bit.SPISWRESET=1
;//启用
ORFIFO SpaRegs.SPIFTX1.SPIT.FRIX.1; SPIT.FRESRS.SP1.
SPI_READ代码(与SPI_WRITE函数类似)
void esc_read(uint16_t offset_addr, void *buf, uint16_t len, void *talevent)
{uint16_t
i,cmd, readval, NumWords =0, j;
uint16_t *ptr =(uint16_t *)0;
uint16_t readphase [16];//
如果fift = 1tr; f0,则可以读<+10s (ints=1ws <+10s=1ws //从TI SPI的FIFO
一次只能读取26字节的有效负载(+4字节的地址){//
为SPI xmission将地址cmd字节构建为16位字,
// SPI xmits MSBIT 1st, 因此,必须交换此16b字中的字节来传输
//读取cmd序列的字节顺序:
//字节0:A[12:5]
//字节1:A[4:0],110b (110b是3字节扩展)
// cmd 2:A[15:13],CMD[2:0],00B (011b是使用WS读取
的)/字节3: FFH (等待状态)
//cmd = offset_addr & 0x1f
cmd =(offset_addr & 0x1FE0)<<3;// offset_addr[12:5]是第一个地址
阶段字节,转换为第一个字节cmd ||((offset_addr & 0x1F)<3)| CAT_EtherCAT_3BYTEADDR_3DR_readWords <10_EF10+
对于(i=2, j =0;j<len; i++)//数值以字节数表示;
{
readphase [i]=(uint16_t) ESC_EtherCAT_CONTINUE;
NumWords++;
j++;
j++;
}
readphase [--i]||(TS_EtherCAT_RDMINESC);//将最后一个字节设置为0xFF
/*禁用状态*/
状态= 1.FFI;<= 1= 1= 1=状态(TS_BUFF1=) STETOOT_UT_UTSTEATFSTECAT_ULATF_RDMINEST_STEF1=) STEFF1=
SpiaRegs.SPITXBUF =((readphure[I]&(0xFF))<8);
}
CPU_DELAY _US(5);
j =长;
while (SpiaRegs.SPIFFRX.bit.XBFFST <j);
readval =(SpiaRegs.SPIRUF)& 0xFF;//
spanal =读取前
的spabyte_readvf; spalf=0x1f_readvf=(readf) //读取talevent
*(PTR)|=((readval & 0xFF)<8);
CPU_DELAY _US(2); //读取下一字节前延时
= SpiaRegs.SPIRXBUF;//忽略
CPU_DELAY _US(2); //读取下一字节
前延时= SpiaRegs.SPIRXBUF;//
f= spirt (f)= f; spirxf=1= f; f; f= f; f; fxf=f; f= f; f; f= f; f=f; f; fx= f; f; f= f; f= f; f; f= f; f; fx= f; f; f= f; f; f= f; f; f; f= f; f; f; f= f; f;
{
高级=(SpiaRegs.SPIRXBUF)& 0xFF;
PTR[I]=(readval & 0xFF);
CPU_DELAY _US(2); //读取下一字节前的延迟
高级=(SpiaRegs.SPIRXBUF)& 0xFF;
PTR[I]|=((readval & 0xFF)<8)
SpiaRegs.SPIFFRX.Bit.RXFIFORESET =0;//重置FIFO指针
SpiaRegs.SPIFFRX.Bit.RXORESET =1;//重新启用FIFO操作
/*启用中断*/
EINT;
}