|
LPC2294, Про регистры |
|
|
|
Feb 12 2007, 17:55
|
Группа: Новичок
Сообщений: 14
Регистрация: 11-01-07
Пользователь №: 24 336

|
Здравствуйте, господа! Такой вопрос: можно ли обращаться к 32-разрядным регистрам LPC22xx как к 4 отдельным байтам? Например, регистры Tx данных модуля CAN1, если задать массив по абсолютному адресу: unsigned char DataA[4] _at_ 0xE0044038;
то при дальнейшей записи в этот массив записывается только элемент DataA[0], то есть
DataA[0] = 0x11; DataA[1] = 0x22; DataA[2] = 0x33; DataA[3] = 0x44;
далее в регистре по адресу 0xE0044038 записывается только значение 0х11 или вообще "левое" значение. В Юзер Мануале на 2294 в разделе CAN ничего про это не сказано, а вот в разделе про VIC сказано, что к регистрам VIC можно обращаться только как к слову (нельзя читать или записывать 1 байт или 2 байта, то есть полуслово), это относиться и к регистрам CAN?
|
|
|
|
|
Feb 13 2007, 17:51
|
Группа: Новичок
Сообщений: 14
Регистрация: 11-01-07
Пользователь №: 24 336

|
Блин, круто, но пожалуйста поподробнее, что вы имеете в виду: "Естественно нет"?
|
|
|
|
|
Feb 13 2007, 21:36
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Kaiser @ Feb 13 2007, 16:51)  Блин, круто, но пожалуйста поподробнее, что вы имеете в виду: "Естественно нет"? Даже не знаю как и обьяснить-то  Вы железки никогда не пробовали рисовать? Если да, то вопрос почему - странный. Если нет, то: 1. железяка к которой можно одновременно обращатся, как 8-16-32 битной просто элементатно сложнее получается и без всякой на то надобноcти никто сие делать не будет. Я лично за многие годы ни одного чудака сделавшего такую периферию не видел. Для меня совершенно очевидно, и что и Ваша "надобность" совершенно необдуманная. 2. Дальше - имеем дело с 32bit контроллером - да он вообще с 8bit крайне ограниченный набор команд имеет - если и сделать 8bit шину, то трахаться он будет с обращениями мучительно. 3. Ну и третье - на периферийной шине вообще двух младших адресов нет  Даже массовая восьмибитовая периферия занимет в адресном пространстве по четыре байта. И следует только возблагодарить филипсовцев, что они позволили по четыре байта зараз загружать а не растягивать сие удовольствие работы с мееееедленной периферией на четыре обращения. Не вижу ни малейших причин не взять из буфера сразу четыре байта (путсть даже среди них лишние окажутся) и одним движением положить.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 14 2007, 08:09
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата CAN CONTROLLERS Each CAN Controller has a register structure similar to the Philips SJA1000 and the PeliCAN Library block, but the 8-bit registers of those devices have been combined in 32 bit words to allow simultaneous access in the ARM environment. При желании конечно можно в этих словах усмотреть некоторую недоговорённость, типа прородитель 8-ми битный и прямо про неработоспособность 8-ми битного доступа не сказано, но ... И ИМХО формировать/разбирать пакет желательно в памяти, а с периферией только быстро посылать/принимать.
|
|
|
|
|
Feb 14 2007, 08:42
|
Частый гость
 
Группа: Участник
Сообщений: 175
Регистрация: 18-01-06
Из: Москва
Пользователь №: 13 329

|
Цитата(Alex03 @ Feb 14 2007, 08:09)  Цитата CAN CONTROLLERS Each CAN Controller has a register structure similar to the Philips SJA1000 and the PeliCAN Library block, but the 8-bit registers of those devices have been combined in 32 bit words to allow simultaneous access in the ARM environment.
При желании конечно можно в этих словах усмотреть некоторую недоговорённость, типа прородитель 8-ми битный и прямо про неработоспособность 8-ми битного доступа не сказано, но ... И ИМХО формировать/разбирать пакет желательно в памяти, а с периферией только быстро посылать/принимать.  Видимо, проще практически попробовать, что будет при обращении как к 8-битному регистру. Если оно того так хочется.
--------------------
" Будут с водкою дебаты, отвечай : Нет ребяты-демократы, только чай ! "
|
|
|
|
|
Feb 15 2007, 07:07
|
Группа: Новичок
Сообщений: 14
Регистрация: 11-01-07
Пользователь №: 24 336

|
Спасибо всем откликнувшимся, особенно про "железки". Было бы неплохо обращаться к каждому байту отдельно, но раз нельзя, тогда придётся городить огород, что-то типа: C1TDA1 = (unsigned char)*data; *data++; C1TDA1 |= ((unsigned char)*data)<<8; *data++; C1TDA1 |= ((unsigned char)*data)<<16; *data++; C1TDA1 |= ((unsigned char)*data)<<24;
Ещё обнаружил следующий трабл: требуется отправить 4 сообщения подряд - с одного модуля CAN1 на скорости 1000 Мбит/с, с другого модуля CAN3 на скорости 125 кбит/с, при передаче с CAN1 всё проходит отлично, а модуль CAN3 передаёт 16 раз первое сообщение и виснет, хотя по программе оно должно отправиться только один раз. Функции обслуживания этих модулей одинаковые с поправкой на номер модуля, настройки сети корректные, потому что, если в модуле CAN3 поставить скорость 1000Мбит/с, то 4 сообщения передаются также корректно. В эратте нет никаких ошибок, которые бы могли повлиять эту ситуацию. Если кто сталкивался с такой проблемой, подскажите - на что надо обратить внимание? Перед передачей следующего сообщения проверяется флаг готовности передатчика, прерывания от передатчиков запрещены.
|
|
|
|
|
Feb 15 2007, 10:27
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(Kaiser @ Feb 15 2007, 07:07)  Спасибо всем откликнувшимся, особенно про "железки". Было бы неплохо обращаться к каждому байту отдельно, но раз нельзя, тогда придётся городить огород, что-то типа: C1TDA1 = (unsigned char)*data; *data++; C1TDA1 |= ((unsigned char)*data)<<8; *data++; C1TDA1 |= ((unsigned char)*data)<<16; *data++; C1TDA1 |= ((unsigned char)*data)<<24; Огород не нужен: C1TDA1 = *(unsigned int *)data;
|
|
|
|
|
Feb 16 2007, 05:46
|
Группа: Новичок
Сообщений: 14
Регистрация: 11-01-07
Пользователь №: 24 336

|
Цитата(Andy Mozzhevilov @ Feb 15 2007, 09:28)  Цитата(Kaiser @ Feb 15 2007, 09:07)  Ещё обнаружил следующий трабл: требуется отправить 4 сообщения подряд - с одного модуля CAN1 на скорости 1000 Мбит/с, с другого модуля CAN3 на скорости 125 кбит/с, при передаче с CAN1 всё проходит отлично, а модуль CAN3 передаёт 16 раз первое сообщение и виснет,
А приемники в этом CAN сегменте есть? Они настроены на ту же скорость? Если мне не изменяет память настройка скорости производиться через один регистр CxBTR и для приёмника и для передатчика. К тому же, если задействован только передатчик, то конфигурировать приёмник не требуется. Цитата(gladov @ Feb 15 2007, 12:27)  Цитата(Kaiser @ Feb 15 2007, 07:07)  Спасибо всем откликнувшимся, особенно про "железки". Было бы неплохо обращаться к каждому байту отдельно, но раз нельзя, тогда придётся городить огород, что-то типа: C1TDA1 = (unsigned char)*data; *data++; C1TDA1 |= ((unsigned char)*data)<<8; *data++; C1TDA1 |= ((unsigned char)*data)<<16; *data++; C1TDA1 |= ((unsigned char)*data)<<24;
Огород не нужен: C1TDA1 = *(unsigned int *)data; Согласен с вами. Но у меня массив из 8 unsigned char, поэтому есть 2 пути - или собирать посылку сразу в регистры данных (как показано у меня), или собрать в какой-нибудь промежуточный регистр и переписать как показано у вас. В принципе с этим вопросом разобрались сообща, но вот может по второму вопросу есть какие-нибудь идеи. Почему на одной скорости всё ок, а на другой непонятка такая:-(.
|
|
|
|
|
Feb 16 2007, 06:32
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
Цитата(Kaiser @ Feb 16 2007, 07:46)  Цитата(Andy Mozzhevilov @ Feb 15 2007, 09:28)  Цитата(Kaiser @ Feb 15 2007, 09:07)  Ещё обнаружил следующий трабл: требуется отправить 4 сообщения подряд - с одного модуля CAN1 на скорости 1000 Мбит/с, с другого модуля CAN3 на скорости 125 кбит/с, при передаче с CAN1 всё проходит отлично, а модуль CAN3 передаёт 16 раз первое сообщение и виснет,
А приемники в этом CAN сегменте есть? Они настроены на ту же скорость? Если мне не изменяет память настройка скорости производиться через один регистр CxBTR и для приёмника и для передатчика. К тому же, если задействован только передатчик, то конфигурировать приёмник не требуется. Имеется ввиду, кто принимает передаваемые этим узлом CAN сообщения?
--------------------
Пасу котов...
|
|
|
|
|
Feb 17 2007, 06:07
|
Группа: Новичок
Сообщений: 14
Регистрация: 11-01-07
Пользователь №: 24 336

|
Если вы в вопросе подразумевали - есть ли на шине другой приёмник-устройство на 125 кбит/с - то да, есть другое устройство и даже их два, и я их точно не забываю переконфигурировать на соответствущую скорость.
Насчёт массивов и регистров - конечно ручками оно правильнее, но поначалу я предполагал, что за меня это сделает компилятор. Вот у Микрочипа dsPIC 16 разряный, но с помощью компилятора позволяет обращаться отдельно к полуслову (1 байт) и даже применимо побитное обращение. Ну раз уж такая петрушка, то будем переучиваться.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|