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

 
 
> 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
Ответов
SysRq
сообщение May 18 2009, 05:14
Сообщение #2


Чайник, 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
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
SysRq
сообщение May 18 2009, 09:17
Сообщение #4


Чайник, 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



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 04:30
Рейтинг@Mail.ru


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