Сообщение от dr-fin
|
Поставил Протеус 8.3 сп 2, вообще чтение с памяти перестало идти.
|
Что значит "перестало идти"? Мы как раньше не знали что Вам удавалось считать
Сообщение от ForcePoint
|
Добейтесь что-бы конструкция
.....
.....
выдавала 4011h в терминал - будет о чём разговаривать.
|
- так и сейчас не знаем, что изменилось. А телепаты - они все не здесь.
Кстати, в коде от 4 ноября я так и не увидел предложенный мною тестовый фрагмент с чтением идентификационной информации ПЗУ (т.е., если читается ID, то как минимум правильно подключен и настроен SPI и ПЗУ корректно распознаёт команды от МК).
После этой краткой преамбулы просмотрим Ваш код.
1.
Код:
|
// Port B initialization
DDRB=(1‹‹DDB7) | (0‹‹DDB6) | (1‹‹DDB5) | (1‹‹DDB4) | (0‹‹DDB3) | (0‹‹DDB2) | (0‹‹DDB1) | (0‹‹DDB0);
PORTB=(0‹‹PORTB7) | (0‹‹PORTB6) | (0‹‹PORTB5) | (0‹‹PORTB4) | (0‹‹PORTB3) | (0‹‹PORTB2) | (0‹‹PORTB1) | (0‹‹PORTB0); |
Поскольку PB4 используется как !S (Chip Select) для ПЗУ - было-бы неплохо записать
(1‹‹PORTB4), что-бы не провоцировать коллизии.
2. Настройка SPI - вроде нормально.
3. В подпрограммах записи данных мы видим куски кода предназниченные ни-для-чего и ошибки в циклограмме обмена с ПЗУ. Предположим, мы вызвали FLASH_PageWrite и, по мере необходимости, обращаемся из неё к FLASH_TXByte.
Код:
|
void FLASH_TXByte(unsigned char uData)
{
Считываем статус, но никак не обрабатываем.
FLASH_chipSelectLow();
SPDR = RDSR;
waitForTransferComplete();
SPDR=0xff;
waitForTransferComplete();
//putChar(RDSR);
//SPDR=0xff;
//waitForTransferComplete();
//putChar(SPDR);
FLASH_chipSelectHigh();
Зачем?
FLASH_chipSelectLow();
SPDR = uData;
waitForTransferComplete();
FLASH_chipSelectHigh();
}
void FLASH_PageWrite(int pageAddress,char *uData, char sizeData)
pageAddress имеет 24 разряда (смотрю документацию на M45PE80,
раздел "Page Write (PW)"), а Вы пытаетесь 16 бит использовать.
С большой степенью вероятности - потом просто читаете не оттуда,
куда записали. Итого - пишем longint pageAddress и ...
{
char iterator;
FLASH_TXByte(WREN);
FLASH_chipSelectLow();
SPDR = PW;
waitForTransferComplete();
//FLASH_chipSelectLow();
//SPDR = pageAddress››16;waitForTransferComplete();
... раскомментируем эту строку.
SPDR = pageAddress››8; waitForTransferComplete();
SPDR = pageAddress; waitForTransferComplete();
//SPDR = 0x00;
//FLASH_chipSelectHigh();
for(iterator = 0; iterator ‹ sizeData; iterator++)
{
SPDR = uData[iterator];
waitForTransferComplete();
}
FLASH_chipSelectHigh();
} |
Ну и я-бы поменял местами "waitForTransferComplete()" с "SPDR =".