运用DSP对铁电RAM以SPI的方式进行读写操作,由于需要一次性发送多组8bit数据,时序图如图所示。
在运用28335中的McBSP配置为spi后,在时钟停止模式下,一次性发送6组8bit的数据,第一组数据的时钟个数正确,从第二组到第六组的时钟个数都不正确,如图所示。
当改为每次发送2组数据之后,第2组数据的时钟也会多出一个,变成9个,如图。
初始化代码如下
void init_mcbsp_spi()
{
// McBSP-A register settings
//step1
McbspaRegs.SPCR2.bit.XRST=0; // Reset FS generator, sample rate generator & transmitter
McbspaRegs.SPCR1.bit.RRST=0; // Reset Receiver, Right justify word, Digital loopback dis.
//step2
McbspaRegs.SPCR2.bit.GRST=0;
//step3
McbspaRegs.SPCR1.bit.DLB = 0;
McbspaRegs.SPCR1.bit.CLKSTP = 2; // Together with CLKXP/CLKRP determines clocking scheme
//McbspaRegs.SPCR1.bit.DXENA = 1;
// McbspbRegs.SPCR1.bit.RJUST = 1;
//McbspaRegs.SPCR2.bit.XSYNCERR =1;
McbspaRegs.RCR1.bit.RFRLEN1 = 0; // rcv frame length is 1
McbspaRegs.RCR1.bit.RWDLEN1 = 0; //rcv word is 8bit
McbspaRegs.RCR2.bit.RDATDLY = 1; // FSX setup time 1 in master mode. 0 for slave mode (Receive)
McbspaRegs.RCR2.bit.RPHASE = 0;
McbspaRegs.RCR2.bit.RCOMPAND = 0;
McbspaRegs.XCR1.bit.XFRLEN1=1; //frame length equal 6
McbspaRegs.XCR1.bit.XWDLEN1=0; //transmit word is 8bit
McbspaRegs.XCR2.bit.XDATDLY=0; // FSX setup time 1 in master mode. 0 for slave mode (Transmit)
McbspaRegs.XCR2.bit.XPHASE = 0;
//McbspaRegs.XCR2.bit.XFIG = 0;
// McbspaRegs.XCR2.bit.XCOMPAND =1;
// McbspaRegs.SRGR1.bit.FWID = 150;
McbspaRegs.SRGR1.bit.CLKGDV =150;
McbspaRegs.SRGR2.bit.CLKSM = 1;
McbspaRegs.SRGR2.bit.FSGM = 0;
McbspaRegs.SRGR2.bit.FPER = 0;
McbspaRegs.SRGR2.bit.GSYNC =1;
McbspaRegs.PCR.bit.FSXM = 1;
McbspaRegs.PCR.bit.FSRM = 0; //caution
McbspaRegs.PCR.bit.CLKXM = 1;
McbspaRegs.PCR.bit.CLKRM =0;
McbspaRegs.PCR.bit.SCLKME = 0;
McbspaRegs.PCR.bit.CLKXP = 1; // 1 means falling edge 0 means rising edge
McbspaRegs.PCR.bit.CLKRP = 0;
McbspaRegs.PCR.bit.FSXP = 1;
McbspaRegs.PCR.bit.FSRP = 1;
//step4
McbspaRegs.SPCR2.bit.GRST=1; // Enable the sample rate generator
delay_loop(); // Wait at least 2 SRG clock cycles
//step5
McbspaRegs.SPCR2.bit.XRST=1; // Release TX from Reset
McbspaRegs.SPCR1.bit.RRST=1; // Release RX from Reset
delay_loop();
//step6
McbspaRegs.SPCR2.bit.FRST=1; // Frame Sync Generator reset
}
发送代码如下
int send_data4[]={0x05,0x00};
int counter3 = 0;
for(counter3=0;counter3<=1;counter3++)
{
while(McbspaRegs.SPCR2.bit.XRDY !=1){}
McbspaRegs.DXR1.all=send_data4[counter3];
if(McbspaRegs.SPCR1.bit.RRDY ==1)
{tt = McbspaRegs.DRR1.all;}
}
我仔细看了相关技术手册,在SPI模式下有诸多规定,即使一步步按照这些规定来配置寄存器也没有消除这个问题,已经困扰一个月了,我觉得是能配置成功的,求各位专家为我指点指点!
