servo писал(а):вообще думаю нужна просто функция типаchar sd_readbyte(адрес){
Это не совсем правильная позиция.
Наверное вы уже слышали, что SD(MMC, SDHC?) имеют внутреннюю организацию сектора 512 байт(или 1024, 2048). Так вот, вы можете только начать чтение с нулевого смещения байта внутри одного сектора и закончить либо перечитав все 512 байт, либо использовать инструкции чтения блока неопределенной длины. Допустим желаемые байты находятся по смещению +100, надо прочитать 10 байт. Тогда:
1.Выставляем адрес сектора(+0, +512, +1024 и т.д.).
2.Считываем 100 байт, но на них внимание не обращаем т.к. они не нужны.
3.Считываем нужный +101-й байт.
4.Заверщаем операцию чтения.
5.Повторяем все почти тоже самое но для смещения +102.
Чувствуете разницу? Вместо 10+100 байт вам придется прочитать примерно 1 килобайт. Т.к. нужные поля данных почти всегда имеют длину >1 и <256 байт, то либо сразу буферизуют весь сектор в ОЗУ контроллера, либо считывают всю цепочку.
Дам, посмотрел сейчас в тот код , конкретнее файл _sd.c. Нет четкого разделения уровня драйвера ввода-вывода карты памяти и уровня фат...
Вот функция, кот я когда-то писал для доступа к данным по опр. адресу:
Код: Выделить всё
// Read number bytes from sector //
void read_partial_sector(
unsigned long adress, //sector adress
unsigned char *destination,//destination object - char array
unsigned int offset,//offset in bytes from current sector position; 0=no offset
unsigned char len)//for faster perfomance size reduced to 'char'
{
unsigned int i;
end_read();//stop read if required
send_CMD(CMD18,adress);//send adress of new sector for multiple read
wait_data_ready();
_SRF=1;//serial read opened
while(offset)
{
--offset;
//spi(0xFF);//go to the required byte position in sector
spi_tx_ff;
};
for(i=0;i<len;i++)
{
/////Read byte from SPI/////
SPDR = 0xFF;//start
while(!(SPSR & (1<<SPIF)));//wait until byte will be read
destination[i]=SPDR;
//destination[i]=spi(0xFF);//fill destination object
}
}
Она получает адрес сектора и смещение байтов от начала сектора. Затем она заполняет массив указанной длины.