主题中讨论的其他部件: 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