• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

SD卡的片选问题

ljmf5 2016-11-16 浏览量:1668


1. “如果SD卡在接收复位命令过程中CS低电平有效,则进入SPI模式,否则工作在SD 总线模式。”
这个不太理解,CS的有效性可以改编吗,如何实现?


2. 我的SD卡和LCD都是用SPI读写,我在读取SD卡的语句前后分别添加SD_CS=0;和SD_CS=1;表示使用之前开片选和使用之后关闭片选,但是这样处理了,会出现第一次读取正常,第二次读取出错,这可能是什么原因。


谢谢!


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 1、这是由SD卡的协议所规范的。要使用SD卡的SPI模式,就要遵守这样的协议进行通讯,不是更改更改的。这是一种标准协议。

    2、SD卡与LCD都是SPI的话,那么片选是不同的。你在操作LCD时,是不是误操作了SD卡的片选呢?或是上传个程序,工程看看。

    • 发布于 2016-11-16
    • 举报
    • 评论 1
    • 0
    • 0
ljmf5 回复了 汉云:今天重试,又可以了,代码暂时不知道怎么贴上来 回复

其他答案 数量:7
  • CS的有效性是可编程的,你第二次读错是SPI读取异常吗?
    • 发布于2016-11-16
    • 举报
    • 评论 1
    • 0
    • 0
ljmf5 回复了 Eagleson :谢谢回应,估计是的,读取文件的数据不对。 回复

  • CS的有效性可以改编吗,如何实现?

    没懂、、、SPI的CS不都是低电平有效么。。。


    不贴上函数。很难回答。。。就描述了一下CS。。。

    • 发布于2016-11-16
    • 举报
    • 评论 1
    • 0
    • 0
ljmf5 回复了 fighter :第一个问题,我昨天看了一下视频,还是自己没想清楚。SD卡的操作中,在发送命令的过程中,都会先取消片选再开通片选,这个时候SD_CS就是为0的,之后再进行SPI写命令函数。 回复

ljmf5 回复了 US :你好,谢谢支持,互相学习,共同进步! 回复

  • 1. 首先你要知道SPI的主從關係,一般的四線式接法

    接腳定義如下

    名稱


    別名定義備註
    SCLKSCKSPI 動作的 clockMaster 控制, Slave 只能接受, 不能改變
    MOSISDI, DI, SIMaster Data Output, Slave Data InputMaster 傳送資料給 Slave
    MISOSDO, DO,SOMaster Data Input, Slave Data OutputSlave 傳送資料給 Master
    SSnCS, CS, nSSSlave SelectMaster 選擇被控端時, 將對應的 device 的 select pin 拉 low, 並且使 device 進行 reset. 通常是 GPIO.

    因此CS是硬體已經設計好了,您無從隨意去改動他LOW/HIGH是Enable,您只能根據Datasheet的接腳定義說明去決定當LOW/HIGH時候是Enable


    2. 依照您的意思來看,同個SPI Bus上有兩個Device,但一般SD卡ˋ只要讀取幾次,而LCD要一直刷新,因此LCD占用SPI的時間會比較長,因此我研判是您的Code只讀取一次SD卡的內容,然後LCD去顯示讀取出來的資料或者圖片的應用,所以LCD會不斷刷新,佔用了SPI Bus,因此SD卡要再讀取時就會失敗,除非去停止LCD刷新所占用SPI Bus,以上是我的分析,希望對您有用

    • 发布于2016-11-16
    • 举报
    • 评论 2
    • 0
    • 0
ljmf5 回复了 MOP :理论上是这样的,但我感觉我在执行读取SD卡时,LCD应该没有刷新吧, 回复
MOP 回复了 ljmf5 :嗯,要看整份Code才知道 回复

  • 您指的就是这句吧 这里的低电平有效是指CS信号/功能,默认的是总线模式,若是接收复位命令时低电平,CS功能使能,这时进入SPI模式,很好理解呀!

    第二个问题 MOP分析的有一定道理,但是若是因为读写SPI导致资源占用了,那可以多读几次,再分析!因为没看到您写的程序,若真是LCD读写导致的,可以在刷新中间的间隔里读写SD卡。

    • 发布于2016-11-17
    • 举报
    • 评论 1
    • 0
    • 0
ljmf5 回复了 guyuemao :谢谢解答,第一个问题还是由于基础的东西没有掌握好;第二个问题,今天又把代码重新少进去,又可以了 回复

  • 感谢上面各位的解答,由于在回复的时候不知道怎么贴代码,就把代码贴在这里,统一回复各位

    昨天在加入下面红色高亮的两个语句,第二次读取就出现数据错误,今天又试了下,发现又可以了


    void test(void)
    {
     FIL file;
     UINT br;
     int i,j;
     BLOCK_DATA p;
     char a[4];
           SD_CS=0;
     f_open(&file, "0:/111", FA_READ);  
      for(i=0;i<=2;i++)
      {
       for(j=0;j<=2;j++)
      {
        f_lseek (&file, 72*4*(23-1+j)+4*(42-1+i));
        f_read(&file, p.bytes, sizeof(BLOCK_DATA), &br);   
        block_data[i][j].block.listCount = p.block.listCount; 
        block_data[i][j].block.offset = p.block.offset;
        sprintf(a, "%x",  block_data[i][j].block.listCount);
        LCD_ShowString(10,(10+i*60+j*20),72,16,16,a,WHITE,RED);
        sprintf(a, "%x", block_data[i][j].block.offset);
        LCD_ShowString(80,(10+i*60+j*20),72,16,16,a,WHITE,RED); 
      }
     }
     f_close(&file);
     delay_ms(1000);
     SD_CS=1;
    }

    • 发布于2016-11-17
    • 举报
    • 评论 2
    • 0
    • 0
MOP 回复了 ljmf5 :只有一個CS其實沒有什麼效果的,因為同時Enable,同時Disable,兩邊都會收到命令,最好用兩個GPIO來接線,即SD_CS0和SD_CS1,用SD卡時SD_CS0=0,SD_CS1=1,反之LCD時,SD_CS1=0,SD_CS0=1,以上是建議的讓系統穩定的寫法 回复
guyuemao 回复了 ljmf5 :能读数据最好了 回复

  • 会员你好,有了答案要及时选择最佳答案,别忘了哦
    • 发布于2016-11-22
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

SD卡的片选问题