PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   giao tiep voi sd card (http://www.picvietnam.com/forum/showthread.php?t=4161)

bien_van_khat 18-05-2010 01:02 PM

Bạn chỉ cần đọc sector 0, kiểm tra xem nó là MBR hay bootsector, vì cấu trúc của MBR và bootsector khác nhau.

lybao_huy 18-05-2010 01:48 PM

vậy là chỉ có cách là đọc sector 0 để biết có MBR hay không?có vẻ hơi mệt đấy.
Cảm ơn bạn nhiều.

lybao_huy 18-05-2010 07:15 PM

Tôi dùng MPLAB IDE ver 8.46. tôi có 3 file h.c, g.h, main.c:
1-h.c chứa hàm unsigned long cal1():
unsigned long cal1(){
return 125100;
}
2-g.h chứa hàm unsigned long cal2().
unsigned long cal2(){
return 125100;
}
3-có 2 trường hợp:
3a- main.c chứa lệnh cal2() và in giá trị 125100 lên màn hình.
3b-main.c chứa lệnh cal1() và in giá trị không chính xác lên màn hình nếu giá trị này lớn hơn 32767.

xin các bạn giải thích dùm

lybao_huy 01-06-2010 10:02 PM

cho mình hỏi cái này với: READ_BL_PARTIAL=1 means that smaller blocks can be used as well. The minimum block size will be equal to minimum addressable unit (one byte) và Single Block Mode : The block length for read operations is limited by the device sector size (512 bytes) but can be as small as a single byte. vậy nếu muốn đọc 10 byte thì phải làm sao, chỗ này mình làm theo nhưng không được

dtvtb 17-06-2010 02:46 AM

Xin hỏi mấy huynh trong Root Directory(RD) của FATcó chỗ nào phân biệt Directory nào là cha,Directory nào la con.
Em tìm hiểu cái này thì thấy specific nó ghi 32 bytes cho 1 entry trong RD,nó đề cập đến
khá nhiều khía cạnh:byte phân biệt file và folder,tên file,thời gian tạo....
Nhưng làm sao để phân biệt Directory nào là cha,Directory nào la con thì em đuối...
Mong trợ giúp !

lybao_huy 17-06-2010 10:24 PM

Trích:

Nguyên văn bởi dtvtb (Post 36815)
Xin hỏi mấy huynh trong Root Directory(RD) của FATcó chỗ nào phân biệt Directory nào là cha,Directory nào la con.
Em tìm hiểu cái này thì thấy specific nó ghi 32 bytes cho 1 entry trong RD,nó đề cập đến
khá nhiều khía cạnh:byte phân biệt file và folder,tên file,thời gian tạo....
Nhưng làm sao để phân biệt Directory nào là cha,Directory nào la con thì em đuối...
Mong trợ giúp !

Dường như bạn chưa đọc nhiều về vấn đề này lắm. Thật ra nó cũng rất đơn giản, bạn đọc nó nhiều lần, tìm trên google ấy. Sau đó hỏi tiếp mình sẽ trả lời cho, chứ bạn hỏi chung chung quá.

somali123 18-06-2010 01:15 AM

mấy anh ơi,em đang làm mạch giao tiếp với SD card,nhưng đang bí là trong thư viện orcad không có chân của SDcard,ai có thì post giùm nha,cả bên capture lẫn layout luôn.

tahi 18-06-2010 04:17 PM

thư viện footprint thẻ nhớ của bọn thái
http://www.thaieasyelec.com/Free-Ser...nd-symbol.html

Có ai bị dính bênh reset toàn hệ thống khi cắm nóng thẻ nhớ vào ko ạ...??

minh hai 28-10-2010 06:13 PM

Trích:

Nguyên văn bởi tahi (Post 31533)
code tham khảo của bác falleaf (dùng cho chú dsPIC30F4013).Cụ thể là trong thread này:
http://www.picvietnam.com/forum/showthread.php?t=1663

Code:

#define BLOCK_SIZE 512
unsigned char SD_ReadBlock(unsigned long addr, unsigned char *buf)
{
        unsigned int i;
        unsigned char status;
        unsigned char CMD17_READ_SINGLE_BLOCK[] = {17,0x00,0x00,0x0,0x00,0xFF};
        CMD17_READ_SINGLE_BLOCK[1] = ((addr & 0xFF000000) >> 24);
        CMD17_READ_SINGLE_BLOCK[2] = ((addr & 0x00FF0000) >> 16);
        CMD17_READ_SINGLE_BLOCK[3] = ((addr & 0x0000FF00) >> 8);
        CMD17_READ_SINGLE_BLOCK[4] = ((addr & 0x000000FF));
        SD_Enable();
        i=0;
        do
        {       
                status = SD_WriteCommand(CMD17_READ_SINGLE_BLOCK);
                send_hex(status,"CMD17:");       
                if(i++ > 50)
                {       
                        putsUART1((unsigned int*)"Read sector failed\n\r");
                        break;
                }
        }
        while(status != 0x00);
        //Waif
        Delay_Us(150);
        // Send the read command
        if(status != 0)
        {
                // ABORT: invalid response for read single command
                return 1;
        }
        // Now wait for the "Start Block" token        (0xFE)
        // (see SanDisk SD Card Product Manual v1.9 section 5.2.4. Data Tokens)
        do
        {
                status = SPIRead();
                send_hex(status,"waitf token:");
        } while(status != 0xFE);
        // Read off all the bytes in the block
        for(i = 0; i < BLOCK_SIZE; ++i)
        {
                status = SPIRead();
                *buf = status;
                buf++;
        }       
        // Read CRC bytes
        status = SPIRead();
        status = SPIRead();
        SD_Disable();
        // Following a read transaction, the SD Card needs 8 clocks after the end
        // bit of the last data block to finish up its work.
        // (from SanDisk SD Card Product Manual v1.9 section 5.1.8)
        SPIWrite(0xFF);
        return 0;
}

trong main
status = SD_ReadBlock(0, buffer);
Hàm SD_WriteCommand vẫn giữ nguyên. Hàm read đã có write dummy data (write FF)
Còn lệnh nào có response R1 mà test đuợc không nhỉ. Tốc độ giao tiếp phụ thuộc thế nào với các loại thẻ khác nhau.
Khởi tạo thẻ nhớ với tốc độ 150k, gửi lệnh cmd0 để reset thẻ, R1 = 0x01 (ok..đã in idle state). Sau đó gửi lệnh cmd1 để vào data transfer mode. Chuyển tốc độ lên 1.25MHz. R1 = 0x00 (đã vào mode transfer)
Sau đó gửi lệnh CMD17 để đọc single block thì toàn response 0x20
Ở đây em chỉ đọc 512 byte bắt đầu từ địa chỉ 0x00, không biết đó có phải sector 0 hay ko. (em đã quét cả dải địa chỉ mà vẫn báo về như thế...)
CRC có chú ý gì ko?

Hàm read đã có write dummy data (write FF) ?? bạn ơi cho mình hỏi ghi data FF trong hàm hàm read có ý nghĩa j ? tại sao phải viết dữ liệu giả như thế ?

bien_van_khat 28-10-2010 08:16 PM

Trích:

Nguyên văn bởi minh hai (Post 39677)
Hàm read đã có write dummy data (write FF) ?? bạn ơi cho mình hỏi ghi data FF trong hàm hàm read có ý nghĩa j ? tại sao phải viết dữ liệu giả như thế ?

SPI muốn đọc thì phải ghi!

minh hai 01-11-2010 11:38 AM

bác ơi em mới bắt đầu làm giao tiếp pic với SD card, có điều em muốn hỏi bác là em có thể dùng thẻ micro SD rồi cắm vào Adapter để thay cho thẻ SD card 32M mà project về SD của anh falleaf nói tới không?
(thông cảm em mới làm nên chưa có kiến thức gì về những cái này )

lybao_huy 01-11-2010 05:30 PM

ừ, bạn có thể dùng adapter để cắp thẻ nhớ micro SD vaò, rồi cứ theo sơ đồ Pin của adapter mà kết nối

HYknight 29-11-2010 09:13 PM

2 Attachment(s)
Chào các bác !!!
Em cũng đang ngâm cứu về SDCard
Nhưng hiện tại em mới chỉ khởi tạo cho thẻ mà không được
Reset thì thẻ vẫn trả về được Reponse R1 = 0x01
Đây là code và shematic
Mong các bác xem và giúp đỡ em

Code:

//Chuong trinh giao tiep voi SD card --------------------------
//  ------------ main.c ------------------------------
#include <18F452.h>
#fuses hs,nowdt,nolvp
#use delay (clock = 12000000)
#include <LCD_HYknight.C>
#include <def_18f452.c>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,ERRORS)
#include <SDCard.c>


void main()
    { 
      SETUP_ADC_PORTS(NO_ANALOGS);
      SETUP_SPI (SPI_MASTER |  SPI_SS_DISABLED |SPI_H_TO_L| SPI_CLK_DIV_4 | SPI_XMIT_L_TO_H);
 
      TRISA = 0X00 ;
      TRISC = 0X93;
      TRISB = 0XF0;
      TRISD = 0X0F;
      TRISE = 0X00;
      CS=1;
     
   
      LCD_INIT();
     
      PRINTF("\r\n**** Doc ghi SD card - HYknight - CFOC **** ");     
      PRINTF("\r\n");
      DELAY_MS(2000);
     
      PRINTF("\r\ Khoi tao Card..... ");
      PRINTF("\r\n");
      DELAY_MS(2000);


      if(mmc_init()== 0)
      {
        printf("> Khoi tao card thanh cong...\r\n>");
        DELAY_MS(2000);
      }
      else
      {
      printf("> Khong khoi tao duoc, xin moi khoi tao lai...!\r\n");
      LCD_PUTCHAR("Khong kt duoc");

      }
   


      }



Code:

// --------------- SDCard.c ----------------------
// -----------------------------------------------

#DEFINE CS  rc2 // chip select for MMC
#DEFINE SDO rc5
#DEFINE CLK rc3
#DEFINE SDI rc4

void send_6byte(int8 cmd, int16 argh, int16 argl, int8 crc7);
int mmc_init();

char str[600];
CHAR CH;

int8 HIGH(long data)
{
  int8 modi;
  modi = data>>8;
  return(modi);
}

int8 LOW(long data)
{
  int8 modi;
  modi = data;
  return(modi);
}

void send_6byte(int8 cmd, int16 argh, int16 argl, int8 crc7)
{
  spi_write(cmd);
  spi_write(make8(argh,1));
  spi_write(make8(argh,0));
  spi_write(make8(argl,1));
  spi_write(make8(argh,0));
  spi_write(crc7);
}

int mmc_response(unsigned char response)
{
        unsigned long count = 0xFFFF;          // 16bit repeat, it may be possible to shrink this to 8 bit but there is not much point

        while(SPI_READ(0xFF) != response && --count > 0);

        if(count==0) return 1;                  // loop was exited due to timeout
        else return 0;                          // loop was exited before timeout
}

int mmc_init()
  {
      int i;
      *0x94 |= 0x40;                          // set CKE = 1 - clock idle low
      *0x14 &= 0xEF;                          // set CKP = 0 - data valid on rising edge
     
      CS =1;                    // set cs = 1 (off)
      SPI_WRITE(0xFF);
      for(i=0;i<16;i++)                      // initialise the MMC card into SPI mode by sending clks on
      {
        SPI_WRITE(0xFF);
      }
     
      CS =0;                    // set cs = 0 (on) tells card to go to spi mode when it receives reset
      send_6byte(0x40,0,0,0x95);
     
      for(i= 0; i< 100; i++)
        {
            if(spi_read(0x00)== 0x01)
            {
              break;
            }
        }
       
      if(i>= 100) // Check for Time-out Error
        {
            return(1);
        }
       
      printf("CMD40 OK (R1= 0x01)\n\r");
      DELAY_MS(2000);
      //  ----------> Den day van duoc
     
      send_6byte(0x55, 0, 0, 0xff);
      send_6byte(0x41, 0, 0, 0xff);
   
     
      for(i= 0; i<255; i++)
        {
            if(spi_read(0x00)== 0x00)
            {
              break;
            }
           
        }
         
      if(i>=255)       
        {
            return(1);
        }
       
     
      printf("CMD41 OK (R1= 0x00)\n\r");
      DELAY_MS(2000);
   
      return (0);
     
  }


minh hai 07-12-2010 05:35 PM

2 Attachment(s)
các bác đã có kinh nghiệm là thẻ SDcard cho em hỏi với, em dùng thẻ micro cắm vào adapter rồi dùng như thẻ SDcard bình thường và đã dùng hàm đọc sector để đọc được sector 0 là master boot record và đã thu được như sau hình dưới . nhưng em không biết làm cách nào để đọc cái này. có bác nào làm ơn hướng dẫn em cách để đọc cái này được không và giải thích dùm em có phải em đã đọc sector 0 được rồi phải không và card của em đã active được chưa (hình như là chưa thì phải nhưng không biết tại sao ) và bước tiếp theo em phải làm gì. em xin cảm ơn !

HYknight 11-12-2010 11:36 AM

Hj ! Sau 1 hồi đọc lại bài viết của các anh cũng như tài liệu thì em cũng đã đọc ghi được SDCard
Nhưng em muốn hỏi 1 chút là bây giờ chip em sử dụng là 18F4523 (để dùng luôn ADC 12 bit)
Em đã sử dụng SDCard vậy h em muốn sử dụng cả DS1307 thì có cách nào không ạ ?
Em tìm thì cũng thấy có những IC Real-Time giao tiếp SPI nhưng không tự tin lắm vì thời gian hoàn thành của em là không nhiều.
Còn DS1307 thì em dùng rồi nhưng không biết làm thế nào để dùng cả 2.

Mong các anh chỉ giáo !!!!

bien_van_khat 12-12-2010 01:02 PM

Trích:

Nguyên văn bởi HYknight (Post 40780)
Hj ! Sau 1 hồi đọc lại bài viết của các anh cũng như tài liệu thì em cũng đã đọc ghi được SDCard
Nhưng em muốn hỏi 1 chút là bây giờ chip em sử dụng là 18F4523 (để dùng luôn ADC 12 bit)
Em đã sử dụng SDCard vậy h em muốn sử dụng cả DS1307 thì có cách nào không ạ ?
Em tìm thì cũng thấy có những IC Real-Time giao tiếp SPI nhưng không tự tin lắm vì thời gian hoàn thành của em là không nhiều.
Còn DS1307 thì em dùng rồi nhưng không biết làm thế nào để dùng cả 2.

Mong các anh chỉ giáo !!!!

Bạn có thể làm giao thức I2C = phần mềm. Nếu dùng CCS C thì đã hỗ trợ sẵn. Còn dùng C18 thì tự viết cũng nhanh, vì I2C đơn giản. Code mẫu về I2C mềm có rất nhiều trên mạng.

minh hai 13-12-2010 04:10 PM

bác ơi bác làm ơn giúp em với, em mới làm SDcard và em chưa biết gì về nó cả, mong bác chỉ giáo em với ! em có post các địa chỉ của MBR rồi đó, bác xem và giúp em với

hoathanlq 30-12-2010 05:21 PM

Cho mình hỏi câu hơi ngu....sao không thấy ai nói gì về SD card ở chế độ SD mode vậy...có phải nó quá dễ không....
Mình có search trên Google mà hình như chẳng có ai giao tiếp với SD card qua chế độ SD mode.....Thấy một số người trên diễn đàn khác kêu SD mode dễ hơn SPI mode..mà mình đọc mấy cái tài liệu Product Manual...thấy còn khó hơn cả SPI...

lambaotrung 06-12-2012 09:40 PM

có bác nào làm dc 1 bài của thể về việc giao tiếp giửa PIC và SD card chưa.


Múi giờ GMT. Hiện tại là 01:24 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam