|
Atmel SAM3U4, Различные вопросы |
|
|
|
Jun 26 2011, 18:46
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Доброго времени суток! Начал потихоньку осваивать SAM3U4C, сделал темку, так как возникают различные вопросы, которые хотелось бы обсудить.
В этом камне, не смотря на два банка, RAM можно использовать как единый блок по адресам 0x20078000 - 0x20083FFF.
Можно ли такую же методику применить к флеш? В комплекте с ИАРом идёт флешлоадер, который шьёт сразу два банка по адресам 0x000E0000 - 0x0011FFFF.
Сделал в .icf файле также, посмотрим, как получится на практике, если вместо 0x00080000 везде в программе использовать 0x000E0000.
Ещё хотел спросить про встроенный RTC, если кто им пользовался.
Я так понял, что модифицировать время тут не так просто - надо сначала остановить часы, записать новые значения, запустить их, и подождать около 1 секунды, пока можно будет проводить следующую модификацию. Вот что интересно - после записи и запуска часов сбрасывается ли прескалер секунд? То есть переход на следующую секунду наступит ровно через секунду после запуска, или раньше, в зависимости от значения прескалера?
|
|
|
|
|
 |
Ответов
(60 - 74)
|
Sep 12 2011, 23:22
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aaarrr @ Sep 13 2011, 02:51)  ообще, я бы IAP-функцию использовал, наверное - меньше телодвижений и расхода RAM нет. В конечном продукте наверное использую IAP но понять что я делаю не так при размещении функций в SRAM хотелось-бы... может я еще что-нить недопонял в настройке басматрикск ? у меня пока вот такЖ Код ldr r1, =MATRIX_BASE_ADDRESS ldr r0, =(2 << MATRIX_SCFG0_DEFMSTR_TYPE_BIT) | (1 << MATRIX_SCFG0_FIXED_DEFMSTR_BIT) str r0, [r1, #MATRIX_SCFG0_BASE_OFFSET] str r0, [r1, #MATRIX_SCFG1_BASE_OFFSET] ldr r0, =(2 << MATRIX_SCFG0_DEFMSTR_TYPE_BIT) | (0 << MATRIX_SCFG0_FIXED_DEFMSTR_BIT) str r0, [r1, #MATRIX_SCFG3_BASE_OFFSET] str r0, [r1, #MATRIX_SCFG4_BASE_OFFSET]
|
|
|
|
|
Sep 22 2011, 18:22
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Потихоньку пишу инициализацию карты памяти контроллером HSMCI. Дошёл до команды ACMD41, после выдачи которой необходимо ждать, пока не снимется статус BUSY. В мануале это делается опросом флага NOTBUSY регистра статуса, пока он не установится в 1. Но проблема в том, что этот флаг находится в 1 сразу после завершения команды  То есть как только устанавливается CMDRDY, опрашиваю NOTBUSY - он всегда в единичке. Соответственно инициализация карты не завершается, в ответе команды ACMD41 (регистр OCR карты памяти) биты 31 и 30 сброшены... Если подождать около секунды и повторно выдать ACMD41 - то в ответе уже всё ОК - бит 31 установлен (инициализация завершена) и 30 сообщает правильную информацию, является ли карта SDHC или нет. Спрашивается - почему контроллер HSMCI не выполняет ожидание статуса BUSY? Может быть, я что-то делаю не так?
|
|
|
|
|
Sep 23 2011, 16:52
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sonycman @ Sep 23 2011, 20:29)  Инициализация карты у меня получается такая: PowerOn -> CMD0 -> CMD8 -> ACMD41 -> CMD2 -> CMD3 -> CMD9 -> CMD7 -> ACMD6. А у меня такая: PowerOn -> CMD0 -> CMD8 -> ACMD41 -> CMD2 -> CMD3 -> CMD7 (select) -> ACMD51 -> ACMD6 (только если поддерживается 4 бита) -> Проверка и выбор high speed (CMD6), если версия спецификации >= 2 -> CMD7 (deselect) -> CMD9 -> Установка скорости интерфейса Цитата(sonycman @ Sep 23 2011, 20:29)  Хотел ещё спросить по поводу операций с блоками - в поле Transfer Type (TRTYP) регистра комманд HSMCI_CMDR какие нужно выбирать значения для single и multiple блоков? Вроде как 0 для одно- и 1 для много- секторных чтения\записи, но вот смущает ещё значение 5 - SDIO Block...  SDIO и SD Memory - это совсем разные вещи.
|
|
|
|
|
Sep 23 2011, 17:00
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Спасибо! Цитата(aaarrr @ Sep 23 2011, 20:52)  если версия спецификации >= 2 -> CMD7 (deselect) -> CMD9 -> Установка скорости интерфейса А вот тут можно разъяснить, для чего делать deselect? Ведь CMD9 можно выдать вообще до CMD7 (select)? Или это имеет отношение к CMD6? Цитата SDIO и SD Memory - это совсем разные вещи. Вот оно что, а у меня эти понятия перемешались вместе  Цитата только если поддерживается 4 бита - неужели встречаются карточки без поддержки 4 бит?
|
|
|
|
|
Sep 23 2011, 17:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sonycman @ Sep 23 2011, 21:00)  А вот тут можно разъяснить, для чего делать deselect? Ведь CMD9 можно выдать вообще до CMD7 (select)? Или это имеет отношение к CMD6? CMD9 можно выдать только карте в "stby", а ACMD51 - только в "tran", поэтому сначала карта выбирается через CMD7 (select), затем переводится в "stby" через CMD7 (deselect). Можно сделать так: PowerOn -> CMD0 -> CMD8 -> ACMD41 -> CMD2 -> CMD3 -> CMD9 -> CMD7 (select) -> ACMD51 -> ACMD6 (только если поддерживается 4 бита) -> Проверка и выбор high speed (CMD6), если версия спецификации >= 2 -> Установка скорости интерфейсаНаврал, нельзя. Цитата(sonycman @ Sep 23 2011, 21:00)  - неужели встречаются карточки без поддержки 4 бит? Ну, как бы надо проверять, если уж все делать честно. Не встречал до сих пор
|
|
|
|
|
Dec 15 2011, 10:28
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Хм, этот HSMCI вообще может корректно обрабатывать статус BUSY карты памяти? Подаю команду CMD7 подряд два раза - просто для интереса, чтобы посмотреть, как меняется статус карточки. Первый раз она обрабатывается нормально, но во второй получаю ошибку таймаута ответа (RTOE: Response Time-out Error)...  Вероятно, карточка всё ещё находится в состоянии BUSY после первой команды CMD7, и этот статус опять не обрабатывается контроллером Но почему? Ведь тип ответа команды задаю правильно - R1b? Разве это не означает, что контроллер должен автоматически ожидать, пока карта не снимет BUSY?
|
|
|
|
|
Dec 15 2011, 10:43
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Dec 15 2011, 14:40)  Нет. Это означает, что программа должна дождаться флага NOTBUSY в SR. Поставил ожидание: Код do { status = AT_MCI0->MCI_SR; } while (!(status & AT_MCI_NOTBUSY)); но никакого эффекта...  Что делать - то? Похоже, повторяется ситуация, как с командой ACMD41 - флаг NOTBUSY устанавливается мгновенно с CMDRDY... ЗЫ: если ждать нужно ручками - зачем тогда вообще ввели специальный тип команды с ответом R1b? Толку то нет. ЗЗЫ: а, так тут наверное я сам напортачил - подавать CMD7(SELECT) два раза подряд, наверное, нельзя. Вот карточка и входит в ступор... Сейчас попробую сначала CMD7(SELECT), а потом сразу CMD7(DESELECT)...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|