|
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. И еще, как мне поменять режим работы флэшки? Если я например хочу, чтобы неактивный тактовый уровень был низким?
|
|
|
|
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|