我使用 TMS320F2812 (在此处称为 DSP)与使用 ET1100芯片组的 EtherCAT 从站控制器进行通信。
我想建立一个8位 SPI 通信、其中 DSP 是主器件、Et1100是从器件。
我的问题包括
SPI 使能线路不能按预期工作。 我希望 SPI 使能线路在通信开始时变为有效(低电平)、然后在8位通信后变为无效(高电平)。 这也让我产生了一个问题:在我加载 TXBUF 后、我是否应该等待 x 微/毫秒、然后再加载下一个 TXBUF? 这是否也会导致使能线路无法按预期工作?
以下函数用于对 et1100进行读取和写入。
void esc_read (uint16_t 地址、void *buf、uint16_t len、void *tALevent){ uint16_t count = 0; unsigned int *ptr; uint16_t ADR = 0; uint16_t I = 0; //ADR =地址; ADR =(地址<<<3)+ESC_CMD_READ; ptr = tALevent; //芯片选择低电平 EALLOW; GpioDataRegs.GPFDAT.BIT.GPIOF3=0;//发送使能(SYNC) //SpiaRegs.SPICTL.bit.TALK = 1; EDIS; SpiaRegs.SPITXBUF = ADR; while (! SpiaRegs.SPISTS.bit.INT_FLAG ); __byte (ptr,0)=(SpiaRegs.SPIRXBUF&0x00FF); SpiaRegs.SPITXBUF = SEND_8BIT (ADR); while (! SpiaRegs.SPISTS.bit.INT_flag ); __byte (ptr,1)=(SpiaRegs.SPIRXBUF&0x00FF); 计数= len; ptr = buf; while ((count--)>1) { i=0; SpiaRegs.SPITXBUF = ESC_NEXT; while (! SpiaRegs.SPISTS.bit.INT_flag ); __byte (ptr、I)=(SpiaRegs.SPIRXBUF&0x00FF); i++; } SpiaRegs.SPITXBUF = ESC_TERM; while (! SpiaRegs.SPISTS.bit.INT_FLAG ); //芯片选择高电平 EALLOW; // SpiaRegs.SPICTL.bit.TALK = 0; GpioDataRegs.GPFDAT.bit.GPIOF3=1;//发送禁用(SYNC) EDIS; __byte (ptr、i)=(SpiaRegs.SPIRXBUF&0xFF); }
void esc_write (uint16_t address、void * buf、uint16_t len、void * tALevent){ uint16_t 计数; uint16_t 虚拟; unsigned int *ptr; uint16_t ADR; ADR =(地址<<<<3)+ESC_CMD_WRITE); ptr = tALevent; //芯片选择低电平 EALLOW; GpioDataRegs.GPFDAT.BIT.GPIOF3=0;//发送使能(SYNC) // SpiaRegs.SPICTL.bit.TAL=1; EDIS; SpiaRegs.SPITXBUF = ADR; while (! SpiaRegs.SPISTS.bit.INT_FLAG ); __byte (ptr,0)=(SpiaRegs.SPIRXBUF&0x00FF); SpiaRegs.SPITXBUF = SEND_8BIT (ADR); while (! SpiaRegs.SPISTS.bit.INT_flag ); __byte (ptr,1)=(SpiaRegs.SPIRXBUF&0x00FF); 计数= len; ptr = buf; while ((count--)>0) { uint16_t i=0; SpiaRegs.SPITXBUF = send_8bit (__byte (ptr、i)); i++; while (! SpiaRegs.SPISTS.bit.INT_FLAG ); 虚拟= SpiaRegs.SPIRXBUF; } //芯片选择高电平 EALLOW; // SpiaRegs.SPICTL.bit.TALK = 0; GpioDataRegs.GPFDAT.bit.GPIOF3=1;//发送禁用(SYNC) EDIS; }
总结-我的主要问题是 SPI 不能按预期工作。
还附加了 SPI 初始化。
静态空 SPI_INIT (空) { EALLOW; GpioMuxRegs.GPFMUX。ALL=0x000F;//选择 GPIO 作为 SPI 引脚 //端口 F MUX - x000 0000 1111 EDIS; DINT; //初始化 SPI FIFO 寄存器 SpiaRegs.SPIFFTX.All=0xA040; SpiaRegs.SPIFFRX.All=0x2040; SpiaRegs.SPIFFCT.All=0x0; SpiaRegs.SPICCR.all =0x0047;//重置打开,(clk pol = 1:下降沿),8位字符位 SpiaRegs.SPICTL.all =0x0006;//启用主控模式、正常相位、 //启用 TALK、禁用 SPI int。 SpiaRegs.SPIBRR = 0x007F;// 150 MHz/4/(127+1)= 292.3 KHz SpiaRegs.SPICCR.all =0x00C7;//从复位中撤回 SPI SpiaRegs.SPIPRI.bit.FREE = 1; //设置断点不会干扰 xmission }