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.

[参考译文] CCS/TMS320F2.8379万D:McBSP - SD卡的SPI接口

Guru**** 2524550 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/659029/ccs-tms320f28379d-mcbsp---spi-interface-to-sd-card

部件号:TMS320F2.8379万D

工具/软件:Code Composer Studio

您好,

我正在使用F2839D微控制器上的McBSP B端口连接SD卡,使用控制套件上名为"SD_Card"的示例项目文件。 最初,我实施了该程序,因为它使用了所示的SPI引出线,没有发现任何问题。我创建了一个文件,写入并读取了它,没有任何问题。  

现在我想使用编程为SPI的McBBSP-B端口来实现同样的功能,因为在我正在开发的产品上,我必须使用这些引脚输出,因为其他三个SPI端口用于连接其它外设。 我遵循了在控制套件McBSP_SPI_Loopback中找到的示例项目...但是该程序无法正常工作,我无法确定我在哪里可能做了错误...

我已按如下所示修改了文件MMC_F2837x.c中的代码:

静态
void POWER_ON (void)//已编辑

/*
*这不会真正打开电源,而是初始化
*与SD卡通信所需的SPI端口和引脚。
*/
EALLOW;
/*启用用于驱动SPI上SDC的外设*/
CpuSysRegs.PCLKCR11.bit.McBSP_B = 1;

/*
*将相应的引脚配置为SPI而不是GPIO。 CS
*信号直接驱动,以确保我们可以通过保持低电平
*使用SD卡完成交易。
*/

GpioCtrlRegs.GPALOCK.bit.GPIO24 = 0;

GpioCtrlRegs.GPALOCK.bit.GPIO25 = 0;

GpioCtrlRegs.GPALOCK.bit.GPIO26 = 0;
GpioCtrlRegs.GPALOCK.bit.GPIO27 = 0;

gpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0;//保留为GPIO,用于手动CS控制

gpioCtrlRegs.GPAGMUX2.bit.GPIO24 = 0;
gpioCtrlRegs.GPAGMUX2.bit.GPIO25 = 0;
gpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 0;

gpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3;//确定
gpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3;//确定
gpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3;//确定

gpioCtrlRegs.GPADIR.bit.GPIO27 = 1;// cs作为输出

gpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;//通常需要拉高MOSI
gpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;//通常需要在高miso下拉
gpioCtrlRegs.GPAPUD.bit.GPIO26 = 1;
gpioCtrlRegs.GPAPUD.bit.GPIO27 = 1;

gpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3;//异步输入
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3;//确定
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;//确定
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;//确定

gpioCtrlRegs.GPACSEL4.bit.GPIO24 = 0;/CPU选择
GpioCtrlRegs.GPACSEL4.bit.GPIO25 = 0;
GpioCtrlRegs.GPACSEL4.bit.GPIO26 = 0;
GpioCtrlRegs.GPACSEL4.bit.GPIO27 = 0;

GpioCtrlRegs.GPALOCK.bit.GPIO24 = 1;
GpioCtrlRegs.GPALOCK.bit.GPIO25 = 1;
GpioCtrlRegs.GPALOCK.bit.GPIO26 = 1;
GpioCtrlRegs.GPALOCK.bit.GPIO27 = 1;
EDIS;

/*断言***芯片为SD卡和串行闪存选择*/
取消选择();


/*配置McBSP_B端口*/
//
// McBSP-B寄存器设置
//
McbspbRegs.SPR2.all = 0x0000;//重置FS生成器,采样率
//发生器和发射器
McbspbRegs.SPCR1.all = 0x0000;//重置接收器,右对齐字,
//数字回送已禁用。
McbspbRegs.pcr.all = 0x0F08;//(CLKXM=CLKRM=FSXM=FSRM= 1,FSXP = 1)
McbspbRegs.SPCR1.bit.DLB =0;
McbspbRegs.SPCR1.bit.CLKSTP =2;//与CLKXP/CLKRP一起使用
//确定计时方案
McbspbRegs.pcr.bit.CLKXP = 1;// cpol = 0,CPHA = 0上升沿
//无延迟
McbspbRegs.pcr.bit.CLKRP = 0;
McbspbRegs.RCR2.bit.RDATDLY = 01;// FSX设置时间1处于主模式。
// 0表示从属模式(接收)
McbspbRegs.XCR2.bit.XDATDLY = 01;// FSX设置时间1处于主模式。
// 0表示从属模式(传输)

McbspbRegs.RCR1.bit.RWDLEN1 = 0;// 8位字
McbspbRegs.XCR1.bit.XWDLEN1 = 0;// 8位字

McbspbRegs.SRGR2.ALL = 0x2000;// CLKSM=1,FPER = 1 CLKG句点
McbspbRegs.SRGR1.all = 0x003F;//帧宽度= 1 CLKG周期,
// CLKGDV=16

McbspbRegs.SPCR2.bit.GRST = 1;//启用采样率生成器
//delay_loop();//至少等待2个SRG时钟周期
DELAY _US (50);
McbspbRegs.SPR2.bit.XRST = 1;//从重置中释放TX
McbspbRegs.SPCR1.bit.RRST = 1;//从重置中释放RX
McbspbRegs.SPR2.bit.frst = 1;//帧同步生成器重置

/*将DI和CS设为高,并对卡的SCLK施加74个以上的脉冲*/
/*才能接受本机命令。 */
//send_initial_clock_train();

//DELAY _US (50);

PowerFlag = 1;
}

/*------------------ */
/*发送80左右时钟转换,同时保持CS和DI高电平。 这是*/
/*在卡通电后需要使其进入SPI模式*/
/*------------------ */
静态
void send_initial_clock_train (void)//已编辑

volatile DWORD

/*确保CS (STE)保持在较高水平。 */
取消选择();

EALLOW;
GpioCtrlRegs.GPALOCK.bit.GPIO24 = 0;
gpioCtrlRegs.GPAMUX2.bit.GPIO24 = 0;
gpioCtrlRegs.GPADIR.bit.GPIO24 = 1;
GpioCtrlRegs.GPALOCK.bit.GPIO24 = 1;
EDIS;
GpioDataRegs.GPASET.bit.GPIO24 = 1;

/*通过SPI发送10个字节。 这会导致时钟摆动*/
/*所需次数。 */
无符号int I;
对于(i = 0;i < 10;I++)

/*写入虚拟数据*/

while (McbspbRegs.SPR2.bit.XRDY == false);//!!!!!!
McbspbRegs.DXR1.all = 0xFF00;

/*在数据写入过程中刷新数据读取。 */

while (McbspbRegs.SPCR1.bit.RRDY == false);
DAT =(McbspbRegs.DR1.all & 0xFF);

}

EALLOW;
GpioCtrlRegs.GPALOCK.bit.GPIO24 = 0;
gpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3;
GpioCtrlRegs.GPALOCK.bit.GPIO24 = 1;
EDIS;

}

/*------------------ */
/*通过SPI (取决于平台)*/向MMC传输一个字节
/*------------------ */

静态
void xmit_SPI (字节数据)//已编辑

volatile dword rcvdat;//包含的文件(如integer.h)用于DWORD定义

/*将数据写入TX fifo */

while (McbspbRegs.SPCR2.bit.XRDY == false);
McbspbRegs.DXR1.all =((DWORD) dat)<8;//写入数据


/*刷新写入期间读取的数据*/

while (McbspbRegs.SPCR1.bit.RRDY == false);
rcvdat =(McbspbRegs.DR1.all && 0xFF);

// UARTprintf ("\n Inside xmit SPI函数\n");


}


/*------------------ */
/*通过SPI从MMC接收字节(取决于平台)*/
/*------------------ */

静态
字节RCVR_SPI (void)//已编辑

volatile dword rcvdat;

//禁用传输通道
//SpicRegs.SPICTL.bit.Talk = 0;


/*写入虚拟数据*/

while (McbspbRegs.SPCR2.bit.XRDY == false);
McbspbRegs.DXR1.all = 0xFF00;


/*从RX fifo *读取数据

while (McbspbRegs.SPCR1.bit.RRDY == false);
rcvdat =(McbspbRegs.DR1.all & 0xFF);


return (byte) rcvdat;
}

我保留了函数的名称,只是修改了McBSP操作的内容。 也许有人能指出我在配置中是否漏掉了任何东西或做了一些错误吗?

我还看到了振荡波形,主控制器正在将时钟和数据输出到SD卡,但是SD卡作为从控制器没有响应。

谢谢

Johann

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好,请大家对此问题有什么想法,因为我有点卡在这里,感谢大家的帮助。谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Johann,

    很抱歉回复太晚。 您是否能够自行解决问题?

    您是否已验证时钟配置是否适合SD卡要求。 验证时钟极性和相位匹配。

    谢谢!
    标记