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

 
 
> AT91SAM7X256+AT45DB321C-CNC, Как записывать/читать?
Timofey
сообщение Oct 17 2006, 08:46
Сообщение #1


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

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Вобщем у меня есть плата, на ней запаен этот контроллер (хотя он собственно и не важен) и эта флэшка. SPI на контроллере настроен, работает (вроде бы). Вот инициализация:
Код
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,        
        ((unsigned int)AT91C_PA12_SPI0_NPCS0   ) |
        ((unsigned int)AT91C_PA16_SPI0_MISO    ) |
        ((unsigned int)AT91C_PA17_SPI0_MOSI    ) |
        ((unsigned int)AT91C_PA18_SPI0_SPCK    ) ,
        ((unsigned int)AT91C_PA13_SPI0_NPCS1   ) |
        ((unsigned int)AT91C_PA14_SPI0_NPCS2   ) |
        ((unsigned int)AT91C_PA15_SPI0_NPCS3   ) );
  
  
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_SPI0 );
AT91F_SPI_Reset(AT91C_BASE_SPI0); //определяет регистр SPI_MR
AT91F_SPI_CfgMode(AT91C_BASE_SPI0,
AT91C_SPI_MSTR | //мастер
AT91C_SPI_PS_FIXED | //фиксирования периферия
AT91C_SPI_MODFDIS | //Mode fault detection is disabled.
((0x04 << 24) & AT91C_SPI_DLYBCS)
); AT91C_BASE_SPI0->SPI_CR = AT91C_SPI_LASTXFER | AT91C_SPI_SPIEN;
//AT91C_BASE_SPI0->SPI_TDR = AT91C_SPI_LASTXFER;
AT91F_SPI_CfgCs(AT91C_BASE_SPI0,
0,//номер регистра
AT91C_SPI_BITS_8 |
((0x05 << 8) & AT91C_SPI_SCBR) | //Serial Clock Baud Rate (делитель мастер клока)
((0x01 << 24) & AT91C_SPI_DLYBCT) |
((0x10 << 16) & AT91C_SPI_DLYBS)
);
У меня вопрос, как записывать во флэш данные и считывать? Насколько я понял там можно считывать/записывать как из самой флэш, так и её двух буферов? Вобще, как лучше организовать хранение массива? Мне нужно записывать на неё массив размерностью 20 на 500 типа байт и считывать его .... Был бы признателен инструкции на русском языке .... на англ есть, но я еще не достаточно выучил этот международный язык ....А может можно как то сделать так, чтобы контроллер уже знал сам что у него вот такая то переменная лежит там то и я бы просто писал в программе допустим MAS[1][1]=0xAA и он бы сам уже записывал куда надо ..... Ну это мечта smile.gifЗарание спасибо.

Сообщение отредактировал Timofey - Oct 17 2006, 08:48
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Forger
сообщение Oct 17 2006, 10:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Timofey @ Oct 17 2006, 12:46) *
У меня вопрос, как записывать во флэш данные и считывать?


По-русски есть здесь, аналогично http://www.gaw.ru/html.cgi/txt/ic/Atmel/me...db642/start.htm
и для at45db321
Go to the top of the page
 
+Quote Post
Timofey
сообщение Oct 17 2006, 11:11
Сообщение #3


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

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Цитата(Forger @ Oct 17 2006, 16:26) *
Цитата(Timofey @ Oct 17 2006, 12:46) *

У меня вопрос, как записывать во флэш данные и считывать?


По-русски есть здесь, аналогично http://www.gaw.ru/html.cgi/txt/ic/Atmel/me...db642/start.htm
и для at45db321

Спасибо большое! Теперь хоть все понятно.

Сообщение отредактировал Timofey - Oct 17 2006, 11:14
Go to the top of the page
 
+Quote Post
Timofey
сообщение Oct 20 2006, 06:53
Сообщение #4


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

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Чего то опять затупил .... sad.gif Вобщем инициализация SPI осталась таже, что и в начале, только добавил следующие строчки:
Код
AT91F_PDC_EnableRx(AT91C_BASE_PDC_SPI0);
AT91F_PDC_EnableTx(AT91C_BASE_PDC_SPI0);
AT91F_PDC_Open(AT91C_BASE_PDC_SPI0);
Имеются еще два массиваunsigned char SPI_SEND[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char SPI_IN[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Порядок действия такой:Я получаю через 232 с компа байт (он приходит верно, проверено) и отправляю его в первый буфер флэшки
Код
SPI_SEND[0]=0x84;
SPI_SEND[4]=BUFF_485_IN;
while (!((AT91C_BASE_SPI0->SPI_SR) & AT91C_SPI_TXEMPTY));
AT91F_SPI_CfgPCS(AT91C_BASE_SPI0,0);
AT91F_SPI_SendFrame(AT91C_BASE_SPI0,SPI_SEND,6,0,0);
while(!AT91F_PDC_IsRxEmpty(AT91C_BASE_PDC_SPI0));
BUFF_485_IN - это пришедший байт с компа84 - команда записи в первый буфер флэшки, потом идут 13 незначащих бит и 11 с адресом, куда записывать этот байт в буфере (у меня он равен нулю, ставил и другие). За всеми этими инструкциями идет сам байт.После этого пытаюсь этот байт считать из буфера
Код
SPI_SEND[0]=0x54;
SPI_SEND[4]=0x00;
SPI_SEND[5]=0x00;
while (!((AT91C_BASE_SPI0->SPI_SR) & AT91C_SPI_TXEMPTY));
AT91F_SPI_CfgPCS(AT91C_BASE_SPI0,0);
AT91F_SPI_ReceiveFrame(AT91C_BASE_SPI0,SPI_IN,1,0,0);
AT91F_SPI_SendFrame(AT91C_BASE_SPI0,SPI_SEND,6,0,0);
while(!AT91F_PDC_IsRxEmpty(AT91C_BASE_PDC_SPI0));
54 - команда чтения из буфера 1, затем опять 13 незначащих бит и 11 бит адреса, потом нужно еще один байт незначащий и только потом идет прием моего байта (так я понял из инструкции).Когда я смотрю ноги у флэшки осцилографом, то чипселект, клок и входная нога - данные идут, а на выходной ноге - вечный стояк единицы.Ночные танцы в перьях и с бубном вместо прозрения принесли лишь круглые глаза подруги .... sad.gif З.Ы. И еще у меня вопрос по режиам чтения: Насколько я понял, отправляя команду 54 я тем самым указываю, что изначальное состояние клока - низкий уровень, а чипселект высокий, так? (у меня на самом деле все так и есть) Или я чего то не понял?

Сообщение отредактировал Timofey - Oct 20 2006, 06:55
Go to the top of the page
 
+Quote Post
Forger
сообщение Oct 20 2006, 09:13
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Timofey @ Oct 20 2006, 10:53) *
Когда я смотрю ноги у флэшки осцилографом, то чипселект, клок и входная нога - данные идут, а на выходной ноге - вечный стояк единицы.Ночные танцы в перьях и с бубном вместо прозрения принесли лишь круглые глаза подруги .... sad.gif З.Ы. И еще у меня вопрос по режиам чтения: Насколько я понял, отправляя команду 54 я тем самым указываю, что изначальное состояние клока - низкий уровень, а чипселект высокий, так? (у меня на самом деле все так и есть) Или я чего то не понял?


После передачи любой команды необходимо CS возвращать в 1, таким образом внутренний контроллер флэшки запускает команду на выполнение. Это единственный косяк, за который я зацепился в свое время, когда подключал AT45DB161. Посмотрите внимательно диаграммы обмена осциллоскопом и сравните с даташитом все сигналы.

Хотя бы команда запроса статуса работает (не помню код)?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Timofey
сообщение Oct 20 2006, 11:07
Сообщение #6


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

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Цитата(Forger @ Oct 20 2006, 15:13) *
После передачи любой команды необходимо CS возвращать в 1, таким образом внутренний контроллер флэшки запускает команду на выполнение. Это единственный косяк, за который я зацепился в свое время, когда подключал AT45DB161. Посмотрите внимательно диаграммы обмена осциллоскопом и сравните с даташитом все сигналы
Все равно осталось без изенений .... Одни единицы ....
Цитата(Forger @ Oct 20 2006, 15:13) *
Хотя бы команда запроса статуса работает (не помню код)?
Код чтения регистра состояния 57, но он тоже возвращает единицы

Сообщение отредактировал Timofey - Oct 20 2006, 11:10
Go to the top of the page
 
+Quote Post
Forger
сообщение Oct 20 2006, 13:28
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Timofey @ Oct 20 2006, 15:07) *
Код чтения регистра состояния 57, но он тоже возвращает единицы


Ну, раз выходит такая котовасия, то выкладывайте сюда диаграммы с осциллографа (сигналы MOSI,MICO,CS,CLK) для команды 57 и схему подключения AT91 и AT45.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Timofey
сообщение Oct 23 2006, 10:00
Сообщение #8


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

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Цитата(Forger @ Oct 20 2006, 19:28) *
Ну, раз выходит такая котовасия, то выкладывайте сюда диаграммы с осциллографа (сигналы MOSI,MICO,CS,CLK) для команды 57 и схему подключения AT91 и AT45.
Ну у меня осцилограф старый такой, советский и здоровый .... Я даже не представляю как с него диаграммы снять, кроме как фоткать .... Я сейчас остановился на следующем: Нашел такую вот фразу "Если этот бит 1, то устройство не занято, если 0, то устройство занято." А чуть ниже идет таблица, с расписанными битами, где говорится о прямопротивоположном! .... В англ варианте указано, что если 7 бит - единица, то устройство готово. И еще "При включении питания или после сброса микросхема по умолчанию находится в режиме SPI 3 или высокий неактивный тактовый уровень". Поэтому поменяв в инициализации конфигурирование на
Код
AT91F_SPI_CfgCs(AT91C_BASE_SPI0,
0,//номер регистра
AT91C_SPI_BITS_8 |
(((unsigned int) 0x16 << 8) & AT91C_SPI_SCBR) | //Serial Clock Baud Rate (делитель мастер клока)
(((unsigned int) 0x01 << 24) & AT91C_SPI_DLYBCT) |
(((unsigned int) 0x1 <<  0) & AT91C_SPI_CPOL) |
(((unsigned int) 0x1 <<  0) & AT91C_SPI_NCPHA) |
((0x10 << 16) & AT91C_SPI_DLYBS)
);
то есть добавил еще две строки. Сейчас у меня байт статуса возвращается B4h. То есть вроде бы все нормально, но теперь после записи пришедшего на порт 232 байта в буфер 1 и последующего чтения, я всегда получаю байт 46h. И еще, как мне поменять режим работы флэшки? Если я например хочу, чтобы неактивный тактовый уровень был низким?
Go to the top of the page
 
+Quote Post
Forger
сообщение Oct 23 2006, 13:45
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Timofey @ Oct 23 2006, 14:00) *
И еще, как мне поменять режим работы флэшки? Если я например хочу, чтобы неактивный тактовый уровень был низким?


Если мне не изменяет память, то режим работы определяет флешка при переводе мастером #CS с неактивного высокого в активный низкий уровень, одновременно контроллирую состояние то ли CLK, то ли MOSI. Короче, тут наду "курить" даташыт.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Timofey
сообщение Oct 24 2006, 04:09
Сообщение #10


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

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Цитата(Forger @ Oct 23 2006, 19:45) *
Если мне не изменяет память, то режим работы определяет флешка при переводе мастером #CS с неактивного высокого в активный низкий уровень, одновременно контроллирую состояние то ли CLK, то ли MOSI. Короче, тут наду "курить" даташыт.
Да как только я его не курил )) Вобщем спасибо. Буду разбираться дальше.
Go to the top of the page
 
+Quote Post
Forger
сообщение Oct 24 2006, 17:25
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Timofey @ Oct 24 2006, 08:09) *
Да как только я его не курил )) Вобщем спасибо. Буду разбираться дальше.


Вот эти сырцы "покурите", рабочие, не демо - моть что полезное обнаружится:
http://www.forger.ru/download/SOFT/Sources/at45lib.rar
Прикрепленные файлы
Прикрепленный файл  at45lib.rar ( 3.85 килобайт ) Кол-во скачиваний: 77
 


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post



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

 


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


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