PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 01-11-2010, 05:30 PM   #1
lybao_huy
Đệ tử 5 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 97
:
ừ, 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
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-11-2010, 09:13 PM   #2
HYknight
Nhập môn đệ tử
 
Tham gia ngày: Aug 2010
Bài gửi: 6
:
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);
       
   }
Hình Kèm Theo
File Type: jpg SDCARD.jpg (169.6 KB, 37 lần tải)
File Type: jpg CARD.jpg (91.9 KB, 27 lần tải)
HYknight vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-12-2010, 05:35 PM   #3
minh hai
Nhập môn đệ tử
 
Tham gia ngày: Jan 2010
Bài gửi: 4
:
Smile

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 !
Hình Kèm Theo
File Type: bmp master boot record 1.bmp (1.47 MB, 17 lần tải)
File Type: bmp master boot record 2.bmp (1.47 MB, 8 lần tải)

thay đổi nội dung bởi: minh hai, 07-12-2010 lúc 05:52 PM.
minh hai vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-12-2010, 11:36 AM   #4
HYknight
Nhập môn đệ tử
 
Tham gia ngày: Aug 2010
Bài gửi: 6
:
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 !!!!
HYknight vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-12-2010, 01:02 PM   #5
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Trích:
Nguyên văn bởi HYknight View Post
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.
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-12-2010, 04:10 PM   #6
minh hai
Nhập môn đệ tử
 
Tham gia ngày: Jan 2010
Bài gửi: 4
:
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
minh hai vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 06:59 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam