Цитата(sensor_ua @ Sep 23 2007, 12:11)

Похоже, чтение регистра статуса неправильное. Покажи. Вероятно отправляешь не 0xD7+1 байт, а только 0xD7 и сразу читаешь содержимое регистра SPI;)
Кажится и в правду. Сложно без BUSY. Сам код:
#define BUFFER_1_WRITE 0x84 // запись буфера 1
#define BUFFER_2_WRITE 0x87 // запись буфера 2
#define BUFFER_1_READ 0xD4 // чтение буфера 1
#define BUFFER_2_READ 0xD6 // чтение буфера 2
#define STATUS_REGISTER 0xD7 // регистр состояния
#define BLOCK_ERASE 0x50 // очистка 512 страниц
void flash_write(unsigned char flash_data)
{
static unsigned int buffer_counter;
// Хранит позицию в буфере для записи следующего байта
static unsigned int page_counter; // Номер страницы в памяти
unsigned char temp = 0x80; //Проверка 7 бита в регистре статуса
// interrupt выключениеd, SPI port включениеd, master mode, MSB first, SPI mode 3, Fcl/4
SPCR = 0x5C; // включили SPI
// Если установлен флаг "new_data" - то обнулим счетчики
if(new_data) // страниц и буферов
{
buffer_counter = 0; // писАть в начало буфера
page_counter = 0; // писАть в нулевую страницу
new_data = 0; // сбросить "new_data" флаг
}
//Вот здесь вопрос - из даташита как я понял надо писать до chip_select
SPDR = STATUS_REGISTER; //Вот тут как раз тема с не важным байтом
while (!(SPSR & temp)); // ждем пока память освободится
//Вот тут как раз тема с не важным байтом
PORTB &= ~DF_CHIP_SELECT; // включение DataFlash
SPDR = BUFFER_1_WRITE;
while (!(SPSR & temp)); // ожидание завершения передачи
SPDR = 0x00; // не важно
while (!(SPSR & temp)); // ожидание завершения передачи
SPDR = (char)(buffer_counter>>8); // не важно
while (!(SPSR & temp)); // ожидание завершения передачи
SPDR = (char)buffer_counter; // buffer address
while (!(SPSR & temp)); // ожидание завершения передачи
SPDR = (char)flash_data; //write data into SPI Data Register
while (!(SPSR & temp)); // ожидание завершения передачи
PORTB |= DF_CHIP_SELECT; // выключение DataFlash
last_byte_position_buffer = buffer_counter;
// сохранили в какую ячейку буфера был записан последн. байт
buffer_counter++;
// Хранит позицию в буфере для записи байта
}
void flash_read(){
unsigned int page_counter = 0;
unsigned int buffer_counter = 0;
unsigned char temp = 0x80;
SPCR = 0x5C; //Включили SPI
PORTB &= ~DF_CHIP_SELECT; // включаем DataFlash
/* Закоментировано, покуда записываю только 176 байт, даже страницу буфера не заполняю, поэтому решил просто записать-прочитать из буфера. Было предположение что функция стирания выставляет 0xFF, а я этой командой пишу это все в буфер из страницы памяти и получаю все байты 0xFF, закоментиорвал но результата не дало. Вот.
SPDR = MM_PAGE_TO_B1_XFER; // передаём страницу в буфер 1
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = (char)(page_counter >> 6);
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = (char)(page_counter << 2);
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; //не имеющий значения байт
while (!(SPSR & temp)); // ожидаем завершения передачи
*/
//Начинается отсюда
SPDR = BUFFER_1_READ; // читаем из буфера 1
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // не имеющего значения байт
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // запись не имеющего значения байта
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // начать с адреса 0 буфера
while (!(SPSR & temp)); // ожидаем завершения передачи
SPDR = 0x00; // запись не имеющего значения байта
while (!(SPSR & temp)); // ожидаем завершения передачи
for (buffer_counter =0; buffer_counter < 176; buffer_counter++)
{
SPDR = 0xFF;
// записываем фиктивное значение в начало сдвигового регистра
while (!(SPSR & temp)); // ожидаем завершения передачи
bt_word[buffer_counter] = (int)SPDR;
// воспроизводим данные из сдвигового регистра
}
PORTB |= DF_CHIP_SELECT; // выключение DataFlash
}
Есть предположение что кривые темы с битами адреса, со всякими смещениями битов влево вправо. Надо будет проработать четко по даташиту. Вот вопрос адрес пишется с BF9 до BF0 или наоборот, тобишь единица должна накидываться начиная со старшего или младшего бита?