Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR и AT45DB642D-SU
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
kostik2
Вот пытаюсь писать данные во 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[i]);
}
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 и потом считать оттуда - работало. а вот через память не получаеся. подскажите что не так ?
Григорий2000
А это не опечатка, что в некоторых процедурах чипселект не отпускается?
SysRq
Программные ошибки тут:
Цитата(kostik2 @ May 18 2009, 07:24) *
SPI_Write_Byte((char)(addr>>13));
Цитата(kostik2 @ May 18 2009, 07:24) *
SPI_Write_Byte((char)(addr>>8));
Чересчур много сдвигаете. Подумайте.
Но ошибка систематическая, при чтении и записи одинаковая, так что должно было записанное прочитаться все равно (только не туда куда надо). М.б. жело в железе, или security опциях.

UPD:
Похоже есть программная ошибка серьезнее: готовность надо проверять _после_ отпускания чипселекта, т.к. команда обращения к памяти выполняться начинает именно в этот момент.
aaarrr
Цитата(SysRq @ May 18 2009, 09:14) *
Программные ошибки тут:

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

Цитата(SysRq @ May 18 2009, 09:14) *
UPD:
Похоже есть программная ошибка серьезнее: готовность надо проверять _после_ отпускания чипселекта, т.к. команда обращения к памяти выполняться начинает именно в этот момент.

Хорошо бы знать, что именно делает AT45Ready().
kostik2
Цитата(aaarrr @ May 18 2009, 09:55) *
Тут их нет, обратите внимание на скобки.


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

void AT45Ready(void)
{
while((PINC & BIT(3))){}; 3-бит - сигнал RDY
}
uriy
Если мне не изменяет память у корпус -SU это SOIC-8. У него нет вывода READY, так что же вы читаете в функции AT45Ready
SysRq
Цитата(aaarrr @ May 18 2009, 09:55) *
Тут их нет, обратите внимание на скобки.
Ммм.. Может я не выспался совсем? cranky.gif
Адрес внутри буфера: XXXXXXXX|XXXXXBBB|BBBBBBBB
Собстно, это отправить по SPI (адрес - это uint16_t): ноль, старший от адреса, младший от адреса. Старший - это не 13 вправо, а всего 8.
Во втором случае почти аналогично.
aaarrr
Цитата(SysRq @ May 18 2009, 13:17) *
Ммм.. Может я не выспался совсем? cranky.gif

Не, это я не выспался smile.gif С адресами там все неправильно.
kostik2
Цитата(uriy @ May 18 2009, 11:29) *
Если мне не изменяет память у корпус -SU это SOIC-8. У него нет вывода READY, так что же вы читаете в функции AT45Ready

AT45DB642D-SU - TSOP28
kostik2
да я пробовал в страницу с адресом 0 писать и читать. тут сдвиг не важен.
не пишет и не считывает. пытался просто считать из страницы - считывает тоже 0.
пипец какой-то. уже и местами менля AT45_ready и AT_DESELECT. ни фига.
kosyak©
Могу дать точно работающий исходник для работы с флэшами AT45DBXXXX...а там уже по образу и подобию
kostik2
Цитата(kosyak© @ May 21 2009, 09:23) *
Могу дать точно работающий исходник для работы с флэшами AT45DBXXXX...а там уже по образу и подобию

буду очень благодарен. шлите на kostiapan@mail.ru
SysRq
Цитата(kostik2 @ May 18 2009, 10:00) *
void AT45Ready(void)
{
while((PINC & BIT(3))){}; 3-бит - сигнал RDY
}
А линия RDY\BUSY к питанию подтянута? У м\с памяти это выход open drain. И не понятно почему у вас AT45Ready ждет появления лог. 0, а не 1, как должно быть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.