查看: 1342|回复: 0

[求助] 【MCX-N947分享】+驱动SD卡遇到的问题

[复制链接]
  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 1118 天

    连续签到: 12 天

    [LV.10]以坛为家III

    28

    主题

    4303

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5856
    最后登录
    2025-8-14
    发表于 2024-7-14 22:16:57 | 显示全部楼层 |阅读模式
    本帖最后由 suncat0504 于 2024-7-14 22:27 编辑

    按照计划,使用N947驱动SD卡设备,从SD卡中读取文件信息。但这几天一直卡在SD卡的初始化处理上了。我手里有两种SD卡模块,
    图片1.png
    图片2.png

    分别使用SD卡和TF卡。模块提供了SPO接口模式。

    这两种模块我是用STM32开发板以及ESP8266都可以正常实现初始化及获取SD卡的信息。唯独在MCX N947上没有成功。使用MCX N947时,目前是用GPIO口模拟SPI方式操作的。使用等是开饭上J6所在的接口位置,并且和TF显示屏共用某些IO端口。
    按照SD卡的通讯协议,在发出74个时钟脉冲后,之后经过一定延时,接着发送CMD0指令,使SD卡进入SPI通信模式。目前就卡在初始化后的CMD0处理上。如果处理正常,在主机发出CMD0指令后,应该受到0x01,视为正常应答,从而继续后面的操作。但目前我测试的结果是:
    1、如果在发送了74个初始化时钟后,延时2ms,接着发送CMD0的话,后续在不断获取来自SD卡模块的应答信息的时候,得到的是0xFE。偶尔是0,也·算是有一定规律,但一直没有出现0x01这个值1.
    2、如果在发送了74个初始化时钟后,延时5s,接着发送CMD0的话,后续不断获取来自SD卡模块的应答信息是0x00
    sd.gif
    有伙伴遇到这样的问题吗?
    测试代码:
    1. int main(void) {
    2.     uint8_t tmp=0;
    3.     uint32_t cnt = 0, i=0, j=0;
    4.     char str[32] = {'\0'};
    5.     uint8_t dat = 0;
    6.     unsigned char pCMD0[6] ={0x40,0x00,0x00,0x00,0x00,0x95}; //CMD0,将SD卡从默认上电后的SD模式切换到SPI模式,使SD卡进入IDLE状态
    7.    
    8.    
    9.     /* Board pin init */
    10.     CLOCK_EnableClock(kCLOCK_Gpio0);
    11.     CLOCK_EnableClock(kCLOCK_Gpio1);
    12.     CLOCK_EnableClock(kCLOCK_Gpio3);

    13.     BOARD_InitPins();
    14.     BOARD_BootClockFRO12M();
    15.    
    16.     /* Initialize the systick module. */
    17.     //SysTick_Config(12000000UL);
    18.     SysTick_Config(12000UL);
    19.    
    20. //    LED_RED_INIT(LOGIC_LED_OFF);
    21. //    LED_GREEN_INIT(LOGIC_LED_ON);
    22.    
    23.     // 重新设置输入输出方向
    24.     ioinit_dir();
    25.    
    26.     Lcd_Init();
    27.    
    28.     // 清屏
    29.     Lcd_Clear(BLACK);
    30.    
    31.     init_state = 0;
    32.    
    33.     delay_ms(100); //延时100mS等待卡上电
    34.    
    35.     //SD_Init();
    36.    
    37.     tmp=0;
    38.     while (1) {
    39.         // 输出74个脉冲
    40.         SD_MOSI_SET;
    41.         SD_CS_SET;
    42.         println("Send 74 Clock.");
    43.         GPIO_PinWrite(SD_SCK_PORT, SD_SCK, 1);
    44.         for (i=0; i<74; i++) {
    45.             SD_MOSI_CLR;
    46.             delay_ms(1);
    47.             SD_MOSI_SET;
    48.             delay_ms(1);
    49.         }
    50.         
    51.         // 延迟一段时间
    52.         //delay_ms(10);
    53.         
    54.         // 发送CMD0,进入SPI模式
    55.         SD_CS_CLR;
    56.         println("Send CMD0.");
    57.         
    58.         //依次写入命令,参数,校验码
    59.         for (j=0; j<6; j++) {
    60.             dat = pCMD0[j];
    61.             for(i=0; i<8; i++) {
    62.                 // 变低电平
    63.                 SD_SCK_CLR;
    64.                 // 准备数据
    65.                 if(dat&0x80) {
    66.                     SD_MOSI_SET; //输出数据
    67.                     
    68.                 } else {
    69.                     SD_MOSI_CLR;
    70.                     
    71.                 }
    72.                 delay_ms(1);
    73.                
    74.                 // 发出上升沿,输出数据
    75.                 SD_SCK_SET;
    76.                 delay_ms(1);
    77.                     
    78.                 dat<<=1;
    79.             }
    80.             
    81.             SD_SCK_CLR;        
    82.         }
    83.         
    84.         SD_MOSI_SET;
    85.         // 发送8个缓冲时钟
    86.         for(i=8;i>0;i--) {
    87.             // 上升沿
    88.             SD_SCK_CLR;
    89.             delay_ms(1);
    90.             // 下降沿
    91.             SD_SCK_SET;
    92.             delay_ms(1);
    93.         }
    94.         
    95.         // 等待回复
    96.         cnt = 200;
    97.         while (cnt-->0) {
    98.             tmp=0xFF;
    99.             for(i=8;i>0;i--) {
    100.                 // 下降沿
    101.                 SD_SCK_CLR;
    102.                 delay_ms(1);
    103.                
    104.                 // 上升沿
    105.                 SD_SCK_SET;
    106.                 delay_ms(1);
    107.                
    108.                 if(ReadSD())        
    109.                     tmp|=1;
    110.                            
    111.                 tmp<<=1;
    112.             }
    113.             
    114.             sprintf(str, "value=%d", tmp);
    115.             println(str);
    116.             
    117.             //if (((~tmp) & 0x01) == 0x01) {
    118.             if ((tmp & 0x01) == 0x01) {
    119.                 println("CMD0 OK.");
    120.                 break;
    121.             }
    122.         }
    123.         if (cnt>= 200) {
    124.             println("CMD0 NG.");
    125.         }
    126.         
    127.         SD_CS_SET;
    128.         
    129.         // 发送8个缓冲时钟
    130.         SD_MOSI_SET;
    131.         for(i=8;i>0;i--) {
    132.             // 上升沿
    133.             SD_SCK_CLR;
    134.             delay_ms(1);
    135.             // 下降沿
    136.             SD_SCK_SET;
    137.             delay_ms(1);
    138.         }


    139.     }
    140. }
    复制代码


    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-14 18:46 , Processed in 0.080386 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表