Bonjour à tous
Je suis débutant et j'ai besoin de votre aide pour repondre à mes questions.
Je dois écrire le programme de mon Pic18f252 lui permettant de stocker des données dans une mémoire MMC. J'ai donc cablé ma MMC en mode SPI avec le Pic.
J'ai effectué des recherches concernant les sources permettant cette communication notament sur ( http://www.microchipc.com/sourcecode/#mmc )mais je n'y comprend pas grand chose, de plus il est en code CCS alors que je travail sous MPLAB.
Tout d'abord, dans le programme, il faut initialiser la MMC par:
* !Cs à l'état haut
* 80 coups d'horloge
* !Cs à l'état bas
* envoie de la commande CMD0 qui permet le reset de la carte
* attent que la MMC reponde avec 01h
* si 01h alors on envoie la commande CMD1
* puis on attend qu'elle reponde 0h00
Si c'est bien le cas alors la carte est initialisée.
Ainsi on a:
****************************** *******************
OUTPUT_HIGH(PIN_C2); // set SS = 1 (off)
for(i=0;i<10;i++) // initialise the MMC card into SPI mode by sending clks on
{
SPI_WRITE(0xFF);
}
OUTPUT_LOW(PIN_C2); // set SS = 0 (on) tells card to go to spi mode when it receives reset
SPI_WRITE(0x40); // send reset command
SPI_WRITE(0x00); // all the arguments are 0x00 for the reset command
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x95); // precalculated checksum as we are still in MMC mode
puts("Sent go to SPI\n\r");
if(mmc_response(0x01)==1)
return 1; // if = 1 then there was a timeout waiting for 0x01 from the mmc
puts("Got response from MMC\n\r");
i = 0;
while((i < 255) && (mmc_response(0x00)==1)) // must keep sending command if response
{
SPI_WRITE(0x41); // send mmc command one to bring out of idle state
SPI_WRITE(0x00); // all the arguments are 0x00 for command one
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0xFF); // checksum is no longer required but we always send 0xFF
i++;
}
if(i >= 254)
return 1; // if >= 254 then there was a timeout waiting for 0x00 from the mmc
************************** MMC get response ****************************** ********/
/**** Repeatedly reads the MMC until we get the response we want or timeout ****/
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
}
Voila donc sous Mplab, j'ai remplacé la commande SPI_WRITE() par WriteSPI(). Par contre je ne sais pas comment remplacer la commande SPI_READ pour Mplab puisqu'on ne peut pas faire passer d'argument sous celui-ci.
Je voudrais savoir la signification des arguments passer sous ses fonctions.
merci d'avance pour vos réponses
-----