2013-09-20 3 views
0

Я пытающегося говорить чип AT45DB081D над SPI, используя следующий код:Как выполнить Continuous массив для чтения флэш-ATMEL Chip AT45DB081D

void efContinuousArrayRead(unsigned char *data, unsigned int page, unsigned int offset, unsigned int length) 
{ 
    unsigned int index; 

    FLASH_SEL_ON 

    SPIShift(0x03); 
    SPIShift((unsigned char)(page >> 7)); 
    SPIShift((unsigned char)((page << 1) | (offset >> 8))); 
    SPIShift((unsigned char)(offset & 0xFF)); 

    for(index = 0; index < length; index++) 
    { 
     data[index] = SPIShift(0x00); 
    } 

    FLASH_SEL_OFF 
} 

У меня есть несколько других команд, работающих в том числе:

  • Buffer 1/2 Read
  • Буфер 1/2 Запись с/без Page Erase
  • основной памяти в буфер 1/2

Учитывая, что эти другие команды работают, я уверен, что FLASH_SEL_ON, SPIShift и т. Д. Работают так, как ожидалось.

Обратите внимание, что я могу читать с Страница 0, любое смещение. Тем не менее, я не могу читать с любой страницы, кроме 0. Это заставляет меня думать, что проблема вращается вокруг моей математики, чтобы указать страницу на наличие ошибок.

В отладке, я обнаружил, что на странице 1, смещение 0, 24-битовый адрес вычисляется как:

00000000 00000010 00000000 

Это выглядит правильно, согласно технической спецификации спецификации для формата адреса:

xxxPPPPP PPPPPPPB BBBBBBBB 

где:

  • х неиспользованный
  • P номер страницы
  • B смещение

Когда я указываю PageNumber = 0, я получаю правильные значения назад, что я поместил туда. Однако, когда я указываю pageNumber = 1, я получаю все 255 значений вместо значений, которые я там ранее размещал.

Как указать адрес для страниц, кроме 0?

ответ

1

Оказалось, что эта команда реализована в порядке. Другие команды были неправильными (например, MainMemoryPageToBufferTransfer). Они вычисляли номер страницы, используя математику для чипа, работающего в режиме 256 байт. Этот чип работает в режиме 264 байта.

Изменение моего решения для этих команд из:

SPIShift(opcode); 
SPIShift(pageNumber >> 8); 
SPIShift((unsigned short)pageNumber, 0x00)); 

к:

SPIShift(opcode); 
SPIShift((unsigned char)(pageNumber >> 7)); 
SPIShift((unsigned char)(pageNumber << 1), 0x00)); 

И отсортирован его. Мои тесты проходили, потому что операции чтения и записи использовали одну и ту же ошибочную логику для указания номера страницы, что заставило меня поверить, что они работают правильно.

 Смежные вопросы

  • Нет связанных вопросов^_^