请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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; }