Цитата(rezident @ Dec 14 2006, 20:24)

Путаница обычно бывает когда забывают принцип SPI:
для того чтобы что-то считать, нужно что-то передать. Если читать регистр приемника SPI сразу по окончании передачи последнего формального байта, то и результат будет соответствующим (неверным). Поэтому в данном случае правильный результат получается после
передачи мастером 9-го байта, который соответствует первому принятому байту из памяти DataFlash. Если нужно считать допустим десять байт, то соотвественно нужно и передать десять байт
после последнего формального.
Думаю, что prottoss , просто не допускает мысли, что для кого-то принцип SPI (см. выше) еще недопонят

Хм... А что сдесь понимать то? записали 8 раз данные в SPDR - для меня это 8 раз послать данные по SPI...
Вот ваш исходник:
Код
//================================================
// Чтение из DataFlash произвольного количества
// байт данных с произвольного адреса
//------------------------------------------------
//аргументы: указатель на структуру данных DataFlash,
// указатель на буфер приемника данных,
// стартовый адрес в DataFlash,
// количество читаемых байт
//возвращает:количество прочитанных байт
//================================================
xWord at45RndRead(st_at45_Data *pntr, xByte *pdst, xLong startAddr, xWord size)
{ //xByte *pdst=pDst;
xWord byteCntr=0; //счетчик считанных байт
xWord pageAddr, byteAddr;
if((startAddr+(xLong)size)>pntr->maxMemSize) //урежем кол-во запрошенных
{ size=(xWord)(pntr->maxMemSize-startAddr); //до реального размера
} //DataFlash
if (size==0) return (0); //нет размера - нет записи
pageAddr=(xWord)(startAddr/(xLong)pntr->maxBufSize);//получим номер страницы
byteAddr=(xWord)(startAddr%(xLong)pntr->maxBufSize);//номер байта в странице
xWord tmp=(pntr->maxBufSize)>>8; //выделим второй байт
while (tmp)
{ pageAddr<<=1; //выровняем номер страницы
tmp>>=1;
}
pageAddr+=(byteAddr>>8); //добавим второй байт
//----- проверяем готовность DataFlash ---------
at45WaitReady(pntr); //ждем готовности DataFlash
DelayAccess(); //задержка между обращениями
//----- чтение основной памяти DataFlash -------
// С ЭТОГО МОМЕНТА НАЧИНАЕТСЯ ОТПРАВКА КОМАНДЫ ЧИПУ: комм PROTTOSS
[b]SET_CS_DATAFLASH; //установим CS для DataFlash
txrxByteSpi(at45_ContArrayRead1, pntr->num); //передаем номер команды
txrxByteSpi((xByte)(pageAddr>>8), pntr->num); //передаем старший байт номера
//страницы
txrxByteSpi((xByte)pageAddr, pntr->num); //передаем младший байт номера
//страницы и старший бит
//номера байта
txrxByteSpi((xByte)byteAddr, pntr->num); //передаем младший байт номера
//байта
txrxByteSpi(0, pntr->num); //формальная передача
txrxByteSpi(0, pntr->num); //формальная передача
txrxByteSpi(0, pntr->num); //формальная передача
txrxByteSpi(0, pntr->num); //формальная передача[/b]
// КОМАНДА ПОСЛАНА - ЧИТАЕМ ДАННЫЕ: комм PROTTOSS
while (byteCntr<size) //читаем данные в буфер
{ *pdst++=txrxByteSpi(0, pntr->num); //приемника данных в
byteCntr++; //соответствии с заданным
} //количеством
RESET_CS_DATAFLASH; //сбросим CS для DataFlash
return(byteCntr);
}
Вопрос: сколько байт Вы послали в команде памяти, что бы начать читать массив? Для тех, кем принцип еще не допонят выделенно комментарием со строчными буквами