This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的团队:
我将 McBSP 配置为 SPI 以驱动 nFLASH。 NFLASH 可以响应 DSP 发送的指令。 由 nflash。的数据波形是正确的、但 DSP 读取的数据不正确、下面是我的代码和波形、我读取的数据是0x90、0xff、0x80、但正确的数据应该是0x20、0x20、0x15 μ s
void McBSPI_IO_Init(void)//SIP初始化 { EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0; // Enable pull-up on GPIO24 (SPISIMO) GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0; // Enable pull-up on GPIO25 (SPISOMI) GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0; // Enable pull-up on GPIO26 (SPICLK) GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3; // Asynch input GPIO24 (SPISIMO) GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3; // Asynch input GPIO25 (SPISOMI) GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3; // Asynch input GPIO26 (SPICLK) GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3; // Asynch input GPIO27 (SPISTE) //下面的值是3 GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3; // Configure GPIO24 as SPISIMO GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // Configure GPIO25 as SPISOMI GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3; // Configure GPIO26 as SPICLK //Configure GPIO27 as SPISTEA GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;// Enable pullup GpioDataRegs.GPASET.bit.GPIO27 = 1; // Load output latch GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0; // GpioCtrlRegs.GPADIR.bit.GPIO27 = 1; // GPIO27 = output EDIS; } void MCBSP_SPI_Init(void)//SPI初始化 { McBSPI_IO_Init();//IO初始化 EALLOW; SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; EDIS; //SET McBSP-B to SPI master mode with no cycle clk delay // McBSP-B register settings McbspbRegs.SPCR2.all=0x0000; // Reset FS generator, sample rate generator & transmitter McbspbRegs.SPCR1.all=0x0000; // Reset Receiver, Right justify word, Digital loopback dis. //McbspbRegs.PCR.all=0x0F08; //(CLKXM=CLKRM=FSXM=FSRM= 1, FSXP = 1) McbspbRegs.SPCR1.bit.RJUST = 0; McbspbRegs.PCR.bit.FSXM=1;//FSX generate by in ternal McbspbRegs.PCR.bit.CLKXM=1;// spi master mode 1 McbspbRegs.PCR.bit.FSXP=1;// FSX active low McbspbRegs.PCR.bit.CLKXP=1;// rising edge of clk,output data valid McbspbRegs.PCR.bit.SCLKME=0;// LSPCLK McbspbRegs.PCR.bit.FSRM=1;//FSR generate by internal McbspbRegs.PCR.bit.CLKRM=1;// CLK R OUTPUT McbspbRegs.PCR.bit.FSRP=1;// FSR active low McbspbRegs.PCR.bit.CLKRP=1;// falling edge of clk,input data valid McbspbRegs.PCR.bit.SCLKME = 0; McbspbRegs.SPCR1.bit.DLB = 0; McbspbRegs.SPCR1.bit.CLKSTP = 0x03;// spi mode with clk delay McbspbRegs.SPCR2.bit.FREE=1; McbspbRegs.SPCR2.bit.SOFT=1; McbspbRegs.RCR2.bit.RPHASE=0;//single frame phase McbspbRegs.RCR2.bit.RCOMPAND=0;//any data size MSB first McbspbRegs.RCR2.bit.RDATDLY=01;// FSX setup time 1 in master mode. 0 for slave mode (Receive) McbspbRegs.XCR2.bit.XPHASE=0;//single frame phase McbspbRegs.XCR2.bit.XCOMPAND=0;// McbspbRegs.XCR2.bit.XDATDLY=01;// FSX setup time 1 in master mode. 0 for slave mode (Transmit) McbspbRegs.RCR1.bit.RFRLEN1=0;// one word per frame McbspbRegs.RCR1.bit.RWDLEN1=0;// 16-bit word McbspbRegs.XCR1.bit.XFRLEN1=0;//one word per frame McbspbRegs.XCR1.bit.XWDLEN1=0;// 16-bit word // McbspbRegs.SRGR2.all=0x2000; // CLKSM=1, FPER = 1 CLKG periods McbspbRegs.SRGR2.bit.GSYNC=0;// McbspbRegs.SRGR2.bit.CLKSM=1;//lspclk McbspbRegs.SRGR2.bit.FSGM=0;//FSG generate when data are copied to XSR1,2 McbspbRegs.SRGR2.bit.FPER=0x02;//no used //McbspbRegs.SRGR1.all= 0x0F0F;// Frame Width = 1 CLKG period, CLKGDV=16 McbspbRegs.SRGR1.bit.CLKGDV=0x3;// LSPCLK/3 (0x5f,过采样有效,小于此值过采样值偏低不准) McbspbRegs.SRGR1.bit.FWID=0x0f;//FSG Pulse width is 16 McbspbRegs.SPCR2.bit.GRST=1;// Enable the sample rate generator delay_loop(); // Wait at least 2 SRG clock cycles McbspbRegs.SPCR2.bit.XRST=1;// Release TX from Reset McbspbRegs.SPCR1.bit.RRST=1;// Release RX from Reset McbspbRegs.SPCR2.bit.FRST=1;// Frame Sync Generator reset } void m25p16_readID(void) { Select_Flash(); while(McbspbRegs.SPCR2.bit.XRDY == 0); McbspbRegs.DXR1.all = RDID&0x00FF; while(McbspbRegs.SPCR2.bit.XRDY == 0); McbspbRegs.DXR1.all = 0xFF; while( McbspbRegs.SPCR1.bit.RRDY == 0 ) ; temp[0] = McbspbRegs.DRR1.all; while(McbspbRegs.SPCR2.bit.XRDY == 0); McbspbRegs.DXR1.all = 0xFF; while( McbspbRegs.SPCR1.bit.RRDY == 0 ) ; temp[1] = McbspbRegs.DRR1.all; while(McbspbRegs.SPCR2.bit.XRDY == 0); McbspbRegs.DXR1.all = 0xFF; while( McbspbRegs.SPCR1.bit.RRDY == 0 ) ; temp[2] = McbspbRegs.DRR1.all; DELAY_US(3); NotSelect_Flash(); }
您好、Wei、
查看您的代码、您已针对 SPI 模式正确设置 McBSP 模块。 我注意到的一点是、你已经 将 RWDLEN1和 XWDLEN1设置为0、这对应于8位、但你的注释显示为16位字、所以如果你尝试发送和接收16位、你应该将它设置为2 (010)。 您可以进行此修改吗?
此致、
Marlyn
大家好、很抱歉、这将配置为8位。 我忘记更改评论了
您好、Wei、
感谢您的澄清。 我们可以在 McBSP 端执行外部回送、以确保通信的那一侧没有任何不正确的地方吗? 如果无法路由信号、则内部回送 也会起作用、但在这种情况下、信号不会路由到引脚本身。
此致、
Marlyn
你(们)好
我已经尝试过反向模型、我可以接收 正确的数据。
您好、Wei、
这是通过外部还是内部回送实现的?
此致、
Marlyn
你(们)好
我进行了内部回送测试。
此致、
Wei
好的、您是否有可用于探测连接的逻辑分析仪? 此外、McBSP 引脚本身上显示的值是多少?
此致、
Marlyn