реклама на сайте
подробности

 
 
> AVR и AT45DB642D-SU, Не пишется инфа во flash
kostik2
сообщение May 18 2009, 03:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375



Вот пытаюсь писать данные во 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 и потом считать оттуда - работало. а вот через память не получаеся. подскажите что не так ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
Григорий2000
сообщение May 18 2009, 04:56
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 13-03-06
Пользователь №: 15 210



А это не опечатка, что в некоторых процедурах чипселект не отпускается?
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 18 2009, 05:14
Сообщение #3


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Программные ошибки тут:
Цитата(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:
Похоже есть программная ошибка серьезнее: готовность надо проверять _после_ отпускания чипселекта, т.к. команда обращения к памяти выполняться начинает именно в этот момент.

Сообщение отредактировал SysRq - May 18 2009, 05:24
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 18 2009, 05:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SysRq @ May 18 2009, 09:14) *
Программные ошибки тут:

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

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

Хорошо бы знать, что именно делает AT45Ready().
Go to the top of the page
 
+Quote Post
kostik2
сообщение May 18 2009, 06:00
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375



Цитата(aaarrr @ May 18 2009, 09:55) *
Тут их нет, обратите внимание на скобки.


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

void AT45Ready(void)
{
while((PINC & BIT(3))){}; 3-бит - сигнал RDY
}
Go to the top of the page
 
+Quote Post
uriy
сообщение May 18 2009, 07:29
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Если мне не изменяет память у корпус -SU это SOIC-8. У него нет вывода READY, так что же вы читаете в функции AT45Ready
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 18 2009, 09:17
Сообщение #7


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(aaarrr @ May 18 2009, 09:55) *
Тут их нет, обратите внимание на скобки.
Ммм.. Может я не выспался совсем? cranky.gif
Адрес внутри буфера: XXXXXXXX|XXXXXBBB|BBBBBBBB
Собстно, это отправить по SPI (адрес - это uint16_t): ноль, старший от адреса, младший от адреса. Старший - это не 13 вправо, а всего 8.
Во втором случае почти аналогично.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 18 2009, 09:45
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SysRq @ May 18 2009, 13:17) *
Ммм.. Может я не выспался совсем? cranky.gif

Не, это я не выспался smile.gif С адресами там все неправильно.
Go to the top of the page
 
+Quote Post
kostik2
сообщение May 18 2009, 10:44
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375



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

AT45DB642D-SU - TSOP28
Go to the top of the page
 
+Quote Post
kostik2
сообщение May 21 2009, 02:24
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375



да я пробовал в страницу с адресом 0 писать и читать. тут сдвиг не важен.
не пишет и не считывает. пытался просто считать из страницы - считывает тоже 0.
пипец какой-то. уже и местами менля AT45_ready и AT_DESELECT. ни фига.
Go to the top of the page
 
+Quote Post
kosyak©
сообщение May 21 2009, 05:23
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Могу дать точно работающий исходник для работы с флэшами AT45DBXXXX...а там уже по образу и подобию
Go to the top of the page
 
+Quote Post
kostik2
сообщение May 21 2009, 06:49
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375



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

буду очень благодарен. шлите на kostiapan@mail.ru
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 21 2009, 11:24
Сообщение #13


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(kostik2 @ May 18 2009, 10:00) *
void AT45Ready(void)
{
while((PINC & BIT(3))){}; 3-бит - сигнал RDY
}
А линия RDY\BUSY к питанию подтянута? У м\с памяти это выход open drain. И не понятно почему у вас AT45Ready ждет появления лог. 0, а не 1, как должно быть.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 19:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01671 секунд с 7
ELECTRONIX ©2004-2016