Advertisement
GeeckoDev

mmc.c

Feb 7th, 2013
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.11 KB | None | 0 0
  1. #include <p18cxxx.h>
  2. #include "mySPI.h"
  3. #include "mmc.h"
  4.  
  5. #include <usart.h>  //pour la phase de debuggage
  6.  
  7. unsigned int MMC_Command( unsigned char cmd, unsigned long arg, unsigned char crc) {
  8.     unsigned char *ptr_arg = (unsigned char *)&arg + 4;
  9.     unsigned char err = 0;
  10.    
  11.     if (cmd >= CMD_NBR) {
  12.         return PB_FORMAT;
  13.     }
  14.    
  15.     // NRC
  16.     err |= SPI_W(OCTET_NRC);
  17.    
  18.     // commande
  19.     err |= SPI_W(cmd | 0x40);
  20.    
  21.     // argument
  22.     err |= SPI_W(*(--ptr_arg));
  23.     err |= SPI_W(*(--ptr_arg));
  24.     err |= SPI_W(*(--ptr_arg));
  25.     err |= SPI_W(*(ptr_arg));
  26.    
  27.     // crc + bit de stop
  28.     err |= SPI_W(crc);
  29.    
  30.     if (err & CONFLIT_BUFFER) {
  31.         return PB_ACCES_BUFFER;
  32.     }
  33.    
  34.     return OK;
  35. }
  36.  
  37. unsigned char MMC_R1_response(unsigned char *rep) {
  38.     unsigned char c;
  39.     int i;
  40.    
  41.     // 255 tentatives maximum
  42.     for (i=0; i!=255; i++) {
  43.         SPI_R(&c);
  44.        
  45.         // une réponse est reçue
  46.         if (c != OCTET_NEUTRE) {
  47.             *rep = c;
  48.             return OK;
  49.         }
  50.     }
  51.    
  52.     // timeout
  53.     *rep = OCTET_NEUTRE;
  54.     return -1;
  55. }
  56.  
  57. unsigned int MMC_Init(void) {
  58.     unsigned char resp;
  59.     char i;
  60.    
  61.     SPI_LowSpeed();
  62.    
  63.     PORTCbits.RC2 = 1; // CS=1
  64.     for (i=0; i!=10; i++) {
  65.         SPI_W(OCTET_NEUTRE);
  66.     }
  67.     PORTCbits.RC2 = 0; // CS=0
  68.    
  69.     // je préfère voir large comme ça au moins je suis sécu
  70.     for (i=0; i!=3; i++) {
  71.         SPI_W(OCTET_NEUTRE);
  72.     }
  73.    
  74.     MMC_Command(CMD_GO_IDLE_STATE, 0, 0x95);
  75.    
  76.     MMC_R1_response(&resp);
  77.     if (resp != R1_IDLESTATE) {
  78.         return PB_RESPONSE;
  79.     }
  80.    
  81.     do {
  82.         MMC_Command(CMD_SEND_OP_COND, 0xFFFFFFFF, 0x01);
  83.         MMC_R1_response(&resp);
  84.     } while (resp != R1_READY);
  85.    
  86.     SPI_MiddleSpeed();
  87.    
  88.     return OK;
  89. }
  90.  
  91. unsigned int MMC_WriteBlock(unsigned long adr, unsigned char *ptrBufIn) {
  92.     unsigned char resp;
  93.     int i;
  94.    
  95.     // commande écriture
  96.     MMC_Command(CMD_WRITE_BLOCK, adr, CRC_VIDE);
  97.     MMC_R1_response(&resp);
  98.     if (resp != R1_READY) {
  99.         return PB_RESPONSE;
  100.     }
  101.    
  102.     // première trame indiquant l'écriture d'un bloc
  103.     SPI_W(OCTET_NEUTRE);
  104.     SPI_W(DT_STARTWRITESINGLEBLOCK);
  105.    
  106.     // envoi de 512 octets de données
  107.     for (i=0; i!=0x200; i++) {
  108.         SPI_W(ptrBufIn[i]);
  109.     }
  110.    
  111.     // envoi du crc sur 2 octets
  112.     SPI_W(CRC_VIDE);
  113.     SPI_W(CRC_VIDE);
  114.    
  115.     // vérification de l'acceptation des données
  116.     SPI_R(&resp);
  117.     if ((resp & 0x1F) != DR_ACCEPTED) {
  118.         return PB_RESPONSE;
  119.     }
  120.    
  121.     // attente de la fin d'écriture
  122.     do {
  123.         SPI_R(&resp);
  124.     } while (resp != OCTET_NEUTRE);
  125.    
  126.     return 0;
  127. }
  128.  
  129. unsigned int MMC_ReadBlock(unsigned long adr, unsigned char *ptrBufOut) {
  130.     unsigned char resp;
  131.     int i;
  132.    
  133.     // commande lecture
  134.     MMC_Command(CMD_READ_SINGLE_BLOCK, adr, CRC_VIDE);
  135.     MMC_R1_response(&resp);
  136.     if (resp != R1_READY) {
  137.         return PB_RESPONSE;
  138.     }
  139.    
  140.     // vérification de la première trame
  141.     SPI_W(OCTET_NEUTRE);
  142.     SPI_R(&resp);
  143.     /*if (resp != DT_STARTREADSINGLEBLOCK) {
  144.         return PB_DATA;
  145.     }*/
  146.    
  147.     // bidouille
  148.     do {
  149.         SPI_R(&resp);
  150.     } while (resp == OCTET_NEUTRE);
  151.    
  152.     // réception de 512 octets de données
  153.     for (i=0; i!=0x200; i++) {
  154.         SPI_R(&ptrBufOut[i]);
  155.     }
  156.    
  157.     // réception du crc, on l'ignore
  158.     SPI_W(OCTET_NEUTRE);
  159.     SPI_W(OCTET_NEUTRE);
  160.    
  161.     // attente de la fin de lecture
  162.     do {
  163.         SPI_R(&resp);
  164.     } while (resp != OCTET_NEUTRE);
  165.    
  166.     return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement