With the last version, Init_Fat is perfect without my code.
Thank you

Moderator: Benj
Code: Select all
MX_UINT8 RetVal, SD_version;
MX_SINT16 i;
FC_CAL_Bit_High_DDR (%a_MX_SPI_FAT_CS_PORT, %a_MX_SPI_FAT_CS_TRIS, %a_MX_SPI_FAT_CS_PIN); // Chip Select pin is disabled
//Init SPI
%a_SPI_Master_Init(); //Call initialise function
AT91C_BASE_PIOA->PIO_CODR = AT91C_PIO_PA21; // Set pin state to 'low'
delay_ms(50); //Wait for card to power up
for(i = 0; i < 10; i++) //Start CARD in SPI mode
{
%a_SPI_Master_Byte(0xFF); //Send 10*8=80 clock pulses
}
Code: Select all
//Boucle tres longue sur Carte SDHC
while (fat_pointer > 0) //Scan FAT for free entry
{
idx_fat = (MX_UINT32) idx_fat + 1; //Increment FAT address - Start at address 2
if(idx_fat == %a_FATS_PER_SECT) //If at the end of the FAT sector
{
fat_address = fat_address + 1;
MX_Get_Buffer(fat_address); //Read next FAT sector
idx_fat = 0;
}
Temp32.AsByte[0] = Read_Byte_From_Buffer(idx_fat * %a_SECT_ADDR_LEN); //Extract data %a_mx_cluster address
Temp32.AsByte[1] = Read_Byte_From_Buffer((idx_fat * %a_SECT_ADDR_LEN) + 1);
Temp32.AsByte[2] = 0;
Temp32.AsByte[3] = 0;
#if (%a_FAT_TYPE == 1 || %a_FAT_TYPE == 2)
if (%a_mx_fat_system == 1)
{
Temp32.AsByte[2] = Read_Byte_From_Buffer((idx_fat * %a_SECT_ADDR_LEN) + 2);
Temp32.AsByte[3] = Read_Byte_From_Buffer((idx_fat * %a_SECT_ADDR_LEN) + 3);
}
#endif
fat_pointer = Temp32.AsLong;
}
Code: Select all
if(idx_fat == %a_FATS_PER_SECT) //If at the end of the FAT sector
{
fat_address = fat_address + 1;
MX_Get_Buffer(fat_address); //Read next FAT sector
idx_fat = 0;
}