工具/软件: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