Перейти к содержанию
    

AVR и AT45DB642D-SU

Вот пытаюсь писать данные во flash.

 

 

вот процедуры:

 

void AT45_write_buffer_begin(unsigned int addr)

{

AT45_CS_ON;

AT45Ready();

SPI_Write_Byte(BUFFER_1_WRITE); // ok

SPI_Write_Byte(0x00);

SPI_Write_Byte((char)(addr>>13));

SPI_Write_Byte((char)addr);

}

 

void AT45_buf_to_mem(unsigned int addr)

{

AT45_CS_ON;

AT45Ready();

SPI_Write_Byte(BUFFER_1_TO_PAGE_WITH_ERASE); // ok

SPI_Write_Byte((char)(addr>>8));

SPI_Write_Byte((char)(addr<<3));

SPI_Write_Byte(0x00);

AT45Ready();

AT45_CS_OFF;

}

 

void WRITE_BUFFER1_TO_MEM(unsigned char *m, unsigned int page)

{

unsigned int i;

AT45_write_buffer_begin(0);

for (i=0;i<PAGE_BYTES;i++)

{

SPI_Write_Byte(m);

}

AT45_CS_OFF;

AT45_buf_to_mem(page);

}

 

void AT45_read_buffer_begin(unsigned int addr)

{

AT45_CS_ON;

AT45Ready();

SPI_Write_Byte(BUFFER_1_READ); // ok

SPI_Write_Byte(0);

SPI_Write_Byte((char)(addr>>13));

SPI_Write_Byte((char)addr);

}

 

void AT45_mem_to_buf(unsigned int addr)

{

AT45_CS_ON;

AT45Ready();

SPI_Write_Byte(MAINPAGE_TO_BUFFER_1); // ok

SPI_Write_Byte((char)(addr>>8));

SPI_Write_Byte((char)(addr<<3));

SPI_Write_Byte(0x00);

AT45Ready();

AT45_CS_OFF;

}

 

void READ_BUFFER1_FROM_MEM(unsigned char *m,unsigned int index,unsigned char count, unsigned int page)

{

unsigned int i;

AT45_mem_to_buf(page);

AT45_read_buffer_begin(0);

for (i=index;i<PAGE_BYTES;i++)

{

if(i<(index+count))

{

m[i-index]=SPI_Read_Byte();

}

else SPI_Read_Byte();

}

AT45_CS_OFF;

}

 

#define PAGE_COUNT 8192

#define BLOCK_COUNT 1024

#define PAGE_BYTES 1056

 

#define BUFFER_1 0x00

#define BUFFER_2 0x01

#define BUFFER_1_WRITE 0x84

#define BUFFER_2_WRITE 0x87

#define BUFFER_1_READ 0xD1

#define BUFFER_2_READ 0xD3

#define BUFFER_1_TO_PAGE_WITH_ERASE 0x83

#define BUFFER_2_TO_PAGE_WITH_ERASE 0x86

#define MAINPAGE_TO_BUFFER_1 0x53

#define MAINPAGE_TO_BUFFER_2 0x55

#define PAGE_ERASE 0x81

#define BLOCK_ERASE 0x50

#define SECTOR_ERASE 0x7C

 

вот текст программы:

 

spi_init();

while(1)

{

TxData1(at45ReadVID());

TxData1(at45ReadStReG());

Del(1000);

if(g==0)

{

g=1;

AT45Mass[1]=0x0a;

AT45Mass[200]=0x0b;

WRITE_BUFFER1_TO_MEM(AT45Mass,10);

Del(1000);

AT45Mass[1]=0;

AT45Mass[200]=0;

READ_BUFFER1_FROM_MEM(AT45Mass,0,220,10);

TxData1(AT45Mass[1]);

TxData1(AT45Mass[200]);

}

}

 

выводятся нули. регистр статуса и id считываются. я такж епробовал записать в буфур 0 и потом считать оттуда - работало. а вот через память не получаеся. подскажите что не так ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Программные ошибки тут:

SPI_Write_Byte((char)(addr>>13));
SPI_Write_Byte((char)(addr>>8));
Чересчур много сдвигаете. Подумайте.

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

 

UPD:

Похоже есть программная ошибка серьезнее: готовность надо проверять _после_ отпускания чипселекта, т.к. команда обращения к памяти выполняться начинает именно в этот момент.

Изменено пользователем SysRq

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Программные ошибки тут:

Тут их нет, обратите внимание на скобки.

 

UPD:

Похоже есть программная ошибка серьезнее: готовность надо проверять _после_ отпускания чипселекта, т.к. команда обращения к памяти выполняться начинает именно в этот момент.

Хорошо бы знать, что именно делает AT45Ready().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут их нет, обратите внимание на скобки.

 

 

Хорошо бы знать, что именно делает AT45Ready().

void AT45Ready(void)

{

while((PINC & BIT(3))){}; 3-бит - сигнал RDY

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если мне не изменяет память у корпус -SU это SOIC-8. У него нет вывода READY, так что же вы читаете в функции AT45Ready

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут их нет, обратите внимание на скобки.
Ммм.. Может я не выспался совсем? :cranky:

Адрес внутри буфера: XXXXXXXX|XXXXXBBB|BBBBBBBB

Собстно, это отправить по SPI (адрес - это uint16_t): ноль, старший от адреса, младший от адреса. Старший - это не 13 вправо, а всего 8.

Во втором случае почти аналогично.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ммм.. Может я не выспался совсем? :cranky:

Не, это я не выспался :) С адресами там все неправильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если мне не изменяет память у корпус -SU это SOIC-8. У него нет вывода READY, так что же вы читаете в функции AT45Ready

AT45DB642D-SU - TSOP28

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да я пробовал в страницу с адресом 0 писать и читать. тут сдвиг не важен.

не пишет и не считывает. пытался просто считать из страницы - считывает тоже 0.

пипец какой-то. уже и местами менля AT45_ready и AT_DESELECT. ни фига.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Могу дать точно работающий исходник для работы с флэшами AT45DBXXXX...а там уже по образу и подобию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Могу дать точно работающий исходник для работы с флэшами AT45DBXXXX...а там уже по образу и подобию

буду очень благодарен. шлите на [email protected]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void AT45Ready(void)

{

while((PINC & BIT(3))){}; 3-бит - сигнал RDY

}

А линия RDY\BUSY к питанию подтянута? У м\с памяти это выход open drain. И не понятно почему у вас AT45Ready ждет появления лог. 0, а не 1, как должно быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...