主题中讨论的其他部件: C2000WARE, controlSUITE
大家好。
我的目标是在ET1100中通过SPI写入函数来读取和写入内存。 以下硬件配置:
- TMS320F2.8379万D:SPI-C多路复用,10.0101万和102 GPIO,GPIO 103作为CS低电平活动,200MHz,LSPCLK 50MHz。
- ET1100:SPI模式3,SPI SEL极性:活动低,数据输出样本:正常。
我尝试逐步配置SPI,因为它在379D手册中已被描述。 下面是我的配置功能:
void spi_fifo_init() { SpicRegs.SPIFFTX.ALL = 0xE040; SpicRegs.SPIFFRX.ALL = 0x2044; SpicRegs.SPIFFCT.ALL = 0x0; InitSpiC(); } void InitSpiC(void){ //初始化SPI-C //启用主中继器(0 ==从中继器,1 ==主中继器) SpicRegs.SPICTL.bit.MASTER_SLAVE = 1; //在更改配置之前将重置设置为低 SpicRegs.SPICCR.bit.SPISWRESET = 0; //时钟极性(0 ==上升,1 ==下降) SpicRegs.SPICCR.bit.CLKPOLARITY = 0; //时钟相位(0 ==正常,1 ==延迟) SpicRegs.SPICTL.bit.CLK_PHASE =0; //设置波特率 SpicRegs.SPIBRR.Bit.SPI_bit_rate = 99; // 8位字符 SpicRegs.SPICCR.bit.SPICHAR =(8-1); //启用传输(Talk) SpicRegs.SPICTL.Bit.Talk = 1; // SPI中断被禁用 SpicRegs.SPICTL.bit.SPIINTENA = 0; //设置可用位 //在断点处停止不会停止SPI SpicRegs.SPIPRI.Bit.free = 1; //从重置中释放SPI spicRegs.SPICCR.bit.SPISWRESET =1; } void InitSpicGpio() { EALLOW; //为所选引脚启用内部上拉 //GpioCtrlRegs.GPDPUD.bit.GPIO100 = 0;//在GPIO100上启用上拉(SPISIMOA) GpioCtrlRegs.GPDDIR.bit.GPIO100 = 1;// mosi作为输出 //GpioCtrlRegs.GPDPUD.bit.GPIO101 = 0;//在GPIO101上启用上拉(SPISOMIA) GpioCtrlRegs.GPDDIR.bit.GPIO101 = 0;// miso作为输出 GpioCtrlRegs.GPDPUD.bit.GPIO102 = 0;//在GPIO102上启用上拉(SPICLKA) gpioCtrlRegs.GPDDIR.bit.GPIO102 = 1;// clk作为输出 GpioCtrlRegs.GPDDIR.bit.GPIO103 = 1;// cs作为输出 GpioCtrlRegs.GPDPUD.bit.GPIO103 = 0;//在GPIO103上启用上拉(SPISTEA) // //将所选引脚的限定条件设置为仅异步 // //这将为所选引脚选择异步(无限定条件)。 //注释掉其他不需要的行。 // gpioCtrlRegs.GPDQSEL1.bit.GPIO100 = 3;//异步输入GPIO16 (SPISIMOA) gpioCtrlRegs.GPDQSEL1.bit.GPIO101 = 3;//异步输入GPIO17 (SPISOMI) GpioCtrlRegs.GPDQSEL1.bit.GPIO102 = 3;//异步输入GPIO18 (SPICLKA) GpioCtrlRegs.GPDQSEL1.bit.GPIO103 = 3;//异步输入GPIO19 (SPISEA) //使用GPIO寄存器配置SPI-C引脚 gpioCtrlRegs.GPDGMUX1.bit.GPIO100 = 1;//将GPIO16配置为SPISIMOA gpioCtrlRegs.GPDGMUX1.bit.GPIO101 = 1;//将GPIO17配置为SPISOMIA GpioCtrlRegs.GPDGMUX1.bit.GPIO102 = 1;//将GPIO18配置为SPICLKA GpioCtrlRegs.GPDGMUX1.bit.GPIO103 = 1;//将GPIO19配置为SPISTEA gpioCtrlRegs.gPDMUX1.bit.GPIO100 = 2;//将GPIO16配置为SPISIMOA gpioCtrlRegs.gPDMUX1.bit.GPIO101 = 2;//将GPIO17配置为SPISOMIA GpioCtrlRegs.GPDMUX1.bit.GPIO102 = 2;//将GPIO18配置为SPICLKA gpioCtrlRegs.gPDMUX1.bit.GPIO103 = 2;//将GPIO19配置为SPISTEA EDIS; }
能否告诉我我我的SPI配置是否为正版? 我不确定,因为我尝试从ET1100 (有关设备类型的信息)读取0x0地址,但txbuffer上没有发生任何事情。 在我的测试代码下方:
unsigned int byte0 = 0x0; unsigned int byte1 = 0b0.0011万; unsigned int byte3 = 0xFF; GpioDataRegs.GPDCLEAR.bit.GPIO103 = 1; ASM (" NOP");//需要15ns延迟 ASM (" NOP"); ASM (" NOP"); ASM (" NOP"); SpyRegs.SPIDAT =(字节0 << 8);//正在发送第一个地址字节 while (SpicRegs.SPISTS.bit.BUFFULL_FLAG); SpyRegs.SPIDAT =(字节1 << 8);//正在发送第二个地址字节 while (SpicRegs.SPISTS.bit.BUFFULL_FLAG); SpyRegs.SPIDAT =(字节3 << 8);//正在发送等待状态字节 while (SpicRegs.SPISTS.bit.BUFFULL_FLAG); SpicRegs.SPIDAT =(字节3 << 8);//发送读取终止字节 while (SpicRegs.SPISTS.bit.BUFFULL_FLAG);
我们非常感谢您提供任何提示。
ET1100数据表: download.beckhoff.com/.../ethercat_et1100_datasheet_v1i9.pdf