Bonjour à tous,

dans le cadre de mon projet de fin d'année, je dois etre capable de gérer une carte SD (lire, ecrire, etc)... Tout est ok appart la lecture et l'écriture d'un secteur dans la carte... J'utilise le compilateur CCS. J'ai pu récupérer la lecture et l'écriture d'un secteur d' une compact flash :

[I]// ATA DRIVE REGISTER ADDRESSES

xdata byte data_reg _at_ 0x8000;
xdata byte feature_reg _at_ 0x8001;
xdata byte err_reg _at_ 0x8001;
xdata byte sec_cnt_reg _at_ 0x8002;
xdata byte sec_num_reg _at_ 0x8003;
xdata byte cyl_low_reg _at_ 0x8004;
xdata byte cyl_high_reg _at_ 0x8005;
xdata byte drv_hd_reg _at_ 0x8006;
xdata byte command_reg _at_ 0x8007;
xdata byte status_reg _at_ 0x8007;


/****************************** ****************************** **************
****************************** ****************************** ***************
Lecture de 512 octets (1 secteur) sur carte CompactFlash.
---------------------------------------------------------------------------
----------------------------------
Return : /
IN : LBA
OUT : buf_cf[512]
****************************** ****************************** ***************/

void read_sector(UI32 LBA)
{
UI16 i;
reset_watchdog();
led=0;
wait_ready();
sec_cnt_reg=0x01; // Nombre de secteur.
sec_num_reg=(byte)(LBA) ; // Numéro du secteur, LBA 7-0
cyl_low_reg=(byte)(LBA >> 8); // Numéro du cylindre (LSB),LBA 15-8
cyl_high_reg=(byte)(LBA >> 16); // Numéro du cylindre (MSB),LBA 23-16
drv_hd_reg=0x0E0; // drv_hd, LBA 27-24 Set LBA bit
command_reg=0x20; // Commande

wait_drq();
for (i=0; i<512;i++)
{
// delms(1);
buf_cf[i]=data_reg;
}
led=1;
//printf("%u",i);
}
UI16 make16(UI8 hi, UI8 low)
{
UI16 val;
val=(hi*0x100) + low;
return(val);
}
UI32 make32(UI8 val1, UI8 val2, UI8 val3, UI8 val4)
{
UI32 val;
val=(val1*0x1000000) +(val2*0x10000) +(val3*0x100) + val4;
return(val);
}
// Lecture des caractéristique de la CF 10/2008
void read_id()
{
UI16 i;
reset_watchdog();
led=0;
wait_ready();
sec_cnt_reg=0x01; // Nombre de secteur.
sec_num_reg=(0) ; // Numéro du secteur, LBA 7-0
cyl_low_reg=(0); // Numéro du cylindre (LSB),LBA 15-8
cyl_high_reg=(0); // Numéro du cylindre (MSB),LBA 23-16
drv_hd_reg=0x0E0; // drv_hd, LBA 27-24 Set LBA bit
command_reg=0xEC; // Commande

wait_drq();
for (i=0; i<512;i++)
{
// delms(1);
buf_cf[i]=data_reg;
}
led=1;

printf("\r\nDefaullt nb of cylindre %u",make16(buf_cf[3],buf_cf[2]));
printf("\r\nCurrent capacity in sectors %lu",make32(buf_cf[117],buf_cf[116],buf_cf[115],buf_cf[114]));
}
/****************************** ****************************** **************
****************************** ****************************** ***************
Ecriture de 512 octets (1 secteur) sur carte CompactFlash.
---------------------------------------------------------------------------
Return : /
IN : LBA, buf_cf[512]
OUT : /
****************************** ****************************** ***************/

void write_sector(UI32 LBA)
{
UI16 i;
reset_watchdog();
led=0;
wait_ready();
sec_cnt_reg=0x01; // Nombre de secteur.
sec_num_reg=(byte)(LBA) ; // Numéro du secteur, LBA 7-0
cyl_low_reg=(byte)(LBA >> 8); // Numéro du cylindre (LSB),LBA 15-8
cyl_high_reg=(byte)(LBA >> 16); // Numéro du cylindre (MSB),LBA 23-16
drv_hd_reg=0x0E0; // drv_hd, LBA 27-24 Set LBA bit
command_reg=0x30; // Commande

wait_drq();
for (i=0; i<512; i++)
data_reg=buf_cf;
led=1;

}


Mon maitre de stage a dit qu'il fallait le modifier et que ca fonctionnerais... Quelqu'un pourrait m'aider svp ? j'ai lu le datasheet mais je ne comprend pas trop ce qu'il faut faire pour mon problemme ... Evidemment si quelqu'un a un source pour lire/ecrire un secteur ca serait aussi le bienvenue ^^. Merci d'avance.