|
AT91SAM7X256+AT45DB321C-CNC, Как записывать/читать? |
|
|
|
Oct 17 2006, 08:46
|
Частый гость
 
Группа: Участник
Сообщений: 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 и он бы сам уже записывал куда надо ..... Ну это мечта  Зарание спасибо.
Сообщение отредактировал Timofey - Oct 17 2006, 08:48
|
|
|
|
|
 |
Ответов
|
Oct 17 2006, 11:11
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 20 2006, 06:53
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
Чего то опять затупил ....  Вобщем инициализация 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 бит адреса, потом нужно еще один байт незначащий и только потом идет прием моего байта (так я понял из инструкции).Когда я смотрю ноги у флэшки осцилографом, то чипселект, клок и входная нога - данные идут, а на выходной ноге - вечный стояк единицы.Ночные танцы в перьях и с бубном вместо прозрения принесли лишь круглые глаза подруги ....  З.Ы. И еще у меня вопрос по режиам чтения: Насколько я понял, отправляя команду 54 я тем самым указываю, что изначальное состояние клока - низкий уровень, а чипселект высокий, так? (у меня на самом деле все так и есть) Или я чего то не понял?
Сообщение отредактировал Timofey - Oct 20 2006, 06:55
|
|
|
|
|
Oct 20 2006, 09:13
|

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

|
Цитата(Timofey @ Oct 20 2006, 10:53)  Когда я смотрю ноги у флэшки осцилографом, то чипселект, клок и входная нога - данные идут, а на выходной ноге - вечный стояк единицы.Ночные танцы в перьях и с бубном вместо прозрения принесли лишь круглые глаза подруги ....  З.Ы. И еще у меня вопрос по режиам чтения: Насколько я понял, отправляя команду 54 я тем самым указываю, что изначальное состояние клока - низкий уровень, а чипселект высокий, так? (у меня на самом деле все так и есть) Или я чего то не понял? После передачи любой команды необходимо CS возвращать в 1, таким образом внутренний контроллер флэшки запускает команду на выполнение. Это единственный косяк, за который я зацепился в свое время, когда подключал AT45DB161. Посмотрите внимательно диаграммы обмена осциллоскопом и сравните с даташитом все сигналы. Хотя бы команда запроса статуса работает (не помню код)?
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Oct 20 2006, 11:07
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 23 2006, 10:00
|
Частый гость
 
Группа: Участник
Сообщений: 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. И еще, как мне поменять режим работы флэшки? Если я например хочу, чтобы неактивный тактовый уровень был низким?
|
|
|
|
|
Oct 24 2006, 04:09
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
Цитата(Forger @ Oct 23 2006, 19:45)  Если мне не изменяет память, то режим работы определяет флешка при переводе мастером #CS с неактивного высокого в активный низкий уровень, одновременно контроллирую состояние то ли CLK, то ли MOSI. Короче, тут наду "курить" даташыт. Да как только я его не курил )) Вобщем спасибо. Буду разбираться дальше.
|
|
|
|
|
Oct 25 2006, 06:21
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
Цитата(Forger @ Oct 24 2006, 23:25)  Цитата(Timofey @ Oct 24 2006, 08:09)  Да как только я его не курил )) Вобщем спасибо. Буду разбираться дальше.
Вот эти сырцы "покурите", рабочие, не демо - моть что полезное обнаружится: http://www.forger.ru/download/SOFT/Sources/at45lib.rar Спасибо
|
|
|
|
|
Jan 24 2007, 18:56
|
Частый гость
 
Группа: Участник
Сообщений: 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 ) | //на остальных еще 3 устройства висят ((unsigned int)AT91C_PA14_SPI0_NPCS2 ) | ((unsigned int)AT91C_PA15_SPI0_NPCS3 ) , 0 ); AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_SPI0 ); AT91F_SPI_Reset(AT91C_BASE_SPI0); //определяет регистр SPI_MR //определяет регистр SPI_MR AT91F_SPI_CfgMode(AT91C_BASE_SPI0, AT91C_SPI_MSTR | //мастер AT91C_SPI_PS_VARIABLE | //Изменяемый выбор периферийного устройства ((unsigned int) 0x0 << 2) | //непосредственное подключение устройств AT91C_SPI_MODFDIS | //Определение ошибки режима работы запрещено ((unsigned int) 0x0 << 7) | //Работа петли местного зацикливания запрещена ((0x01 << 24) & AT91C_SPI_DLYBCS) //Задержка между сигналами выбора корпуса ); AT91C_BASE_SPI0->SPI_CR = AT91C_SPI_LASTXFER | AT91C_SPI_SPIEN; AT91C_BASE_SPI0->SPI_TDR = AT91C_SPI_LASTXFER; //Текущий активный //вывод NPCS будет снят после того, //как завершится передача пакета, записанного TD AT91F_SPI_CfgCs(AT91C_BASE_SPI0, 0,//номер регистра //На этом "висит" флэшка (AT91C_SPI_CPOL) | //логическая единица (AT91C_SPI_NCPHA) | //Ставил равным и 1, и 0 AT91C_SPI_CSAAT | //Стоит 0 AT91C_SPI_BITS_8 | //8 бит данных (AT91C_SPI_SCBR) | //ставил от 0х04 до 0х4 AT91C_SPI_DLYBS | //Ставил вначале 0, сейчас стоит 0x14 (AT91C_SPI_DLYBCT) //Ставил вначале 0, сейчас стоит 0х01 ); AT91F_SPI_CfgCs(AT91C_BASE_SPI0, 1,//номер регистра (AT91C_SPI_CPOL) | (AT91C_SPI_NCPHA) | AT91C_SPI_CSAAT | AT91C_SPI_BITS_8 | (AT91C_SPI_SCBR) | AT91C_SPI_DLYBS | (AT91C_SPI_DLYBCT) ); AT91F_SPI_CfgCs(AT91C_BASE_SPI0, 2,//номер регистра (AT91C_SPI_CPOL) | (AT91C_SPI_NCPHA) | AT91C_SPI_CSAAT | AT91C_SPI_BITS_8 | (AT91C_SPI_SCBR) | AT91C_SPI_DLYBS | (AT91C_SPI_DLYBCT) ); AT91F_SPI_CfgCs(AT91C_BASE_SPI0, 3,//номер регистра (AT91C_SPI_CPOL) | (AT91C_SPI_NCPHA) | AT91C_SPI_CSAAT | AT91C_SPI_BITS_8 | (AT91C_SPI_SCBR) | AT91C_SPI_DLYBS | (AT91C_SPI_DLYBCT) ); AT91F_PDC_Open(AT91C_BASE_PDC_SPI0); AT91F_PDC_EnableRx(AT91C_BASE_PDC_SPI0); AT91F_PDC_EnableTx(AT91C_BASE_PDC_SPI0); Отправляю на запись в первых буфер и затем считываю данные из него же ... Код SPI_SEND[0]=0x84; //Команда на запись в первый буфер SPI_SEND[1]=0x00; SPI_SEND[2]=0x00; SPI_SEND[3]=0x88; //адрес в буфере SPI_SEND[4]=0x11; //4 байта записываю SPI_SEND[5]=0x22; SPI_SEND[6]=0x33; SPI_SEND[7]=0x44; while (!((AT91C_BASE_SPI0->SPI_SR) & AT91C_SPI_TXEMPTY)); AT91F_SPI_CfgPCS(AT91C_BASE_SPI0,0); AT91F_SPI_SendFrame(AT91C_BASE_SPI0,SPI_SEND,8,0,0); //отправляю на запись и жду конца передачи while (!((AT91C_BASE_SPI0->SPI_SR) & AT91C_SPI_TXEMPTY)); SPI_SEND[0]=0x54; SPI_SEND[1]=0x00; SPI_SEND[2]=0x00; SPI_SEND[3]=0x88; SPI_SEND[4]=0x00; SPI_SEND[5]=0x00; SPI_SEND[6]=0x00; SPI_SEND[7]=0x00; while (!((AT91C_BASE_SPI0->SPI_SR) & AT91C_SPI_TXEMPTY)); AT91F_SPI_CfgPCS(AT91C_BASE_SPI0,0); AT91F_SPI_SendFrame(AT91C_BASE_SPI0,SPI_SEND,8,0,0); while (!((AT91C_BASE_SPI0->SPI_SR) & AT91C_SPI_TXEMPTY)); AT91F_SPI_ReceiveFrame(AT91C_BASE_SPI0,SPI_IN,8,0,0); Вобщем чтобы я не отправлял на запись что в буфер, что в саму флэш, я потом считывал всегда одну и ту же комбинацию байт: 00h, 0Eh, 00h, FFh, 00h, 0Eh, 00h, FFh. При простом чтении статуса флэшки, получал ту же комбинацию но уже по очереди. Посмотрел ножки на самой флэшке осцилографом. Все приходит вполне корректно и согласно даташиту на неё, то есть все временные задержки корректны ... Применил совет, что после записи команды необходимо поднять ногу, чтобы флэшка переключилась. пробывал сделать, результат тот же. Хотя когда еще осенью разбирался с ней, у меня статус читался. Почему и он перестал - не понятно, плату вобще никто не трогал. Лежала себе тихонько. Может кто-нибудь уже разобрался с этой проблемой? Плата отладочная, куплена у Аргусофта. Совместные танцы с бубном результата не дали. Отправлял исходники знакомому. Он сказал что должно работать (сам проверить не смог, не на чем).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|