Easyelectronics.ru

Электроника для всех
Текущее время: 26 май 2020, 16:00

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 29 июн 2019, 20:27 
Здравствуйте!

Зарегистрирован: 29 июн 2019, 19:03
Сообщения: 3
Откуда: Красноярск
Друзья! STM32F103C8T после резета в функции main должны отправиться 50шт посылок CAN. То есть, сначала обнуляются все мейлбоксы, а затем по порядку от 1-го до 50-го посылки устанавливаются значениями, а затем отправляются. Каждая по порядку. По факту первой посылки не вижу вообще, зато последняя в двойном экземпляре. Вторая приходит с неправильным 7-м байтом. Все остальные 47 посылок приходят такими, какими я их ждал ))

Посмотрел значения регистров периферии CAN_TDLxR CAN_TDLxR в загруженной прошивке. Пришёл к выводу, что компилятор как бы предугадывая, что предстоит отправлять, заранее прописывает значения посылок в регистры периферии мэйлбоксов. То есть, в регистрах периферии ещё до того, как контроллер запустить, уже какая-то фигня лежит. Причём компилятор делает это начиная с конца очереди, то есть 48, 49 и 50, а даже не 1, 2 и 3. Я подозреваю, что причина вот где-то здесь, так как если не слать никаких посылок из main() ( то есть, не использовать заготовленные константы для содержимого посылок), а принимать значения, например, по USART, а затем отправлять по CAN - то всё работает хорошо. Если кнопкой F10 пробежаться по дебаггеру, то тоже всё выполнится, как я хотел,

но если сделать Run-Stop, то те же косяки никуда не исчезнут.

Функции и команды очистить регистры мэйлбокса типа этой - вообще не сработают.

Код:
for(int i=0; i<3; i++){
   CAN1->sTxMailBox[i].TIR    = 0;
   CAN1->sTxMailBox[i].TDTR =0;       
   CAN1->sTxMailBox[i].TDLR = 0; 
   CAN1->sTxMailBox[i].TDHR = 0;
   
   CAN1->sTxMailBox[i].TIR    &= ~ 0xFFFFFFFF;
   CAN1->sTxMailBox[i].TDTR &= ~ 0xFFFFFFFF;      
   CAN1->sTxMailBox[i].TDLR &= ~ 0xFFFFFFFF;
   CAN1->sTxMailBox[i].TDHR &= ~ 0xFFFFFFFF;
}


Как можно принудительно заставить компилятор ничем не заполнять регистры CAN_TDLxR CAN_TDLxR, сбросить их, а дальше брать значения в соответствии с порядком программы? Перепробовал уже всякое: отключал оптимизацию, инициализацию значений TDLxR TDLxR TIR TDTR через структуры и функции, указатели, использовать только один мэйлбокс. Всё равно компилятор значения того, что предстоит посылать, записывает в периферию заранее... Спасибо за любой совет. Пользуюсь Keil, пробовал компиляторы V5 и V6. STM32F103C8T


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 29 июн 2019, 23:25 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1433
SvetlAlex, чудес не бывает. Компилятор делает ровно то что вы ему написали. Ничего он предугадывать не может, не валите с больной головы на здоровую. Ищите ошибку в коде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 30 июн 2019, 14:38 
Здравствуйте!

Зарегистрирован: 29 июн 2019, 19:03
Сообщения: 3
Откуда: Красноярск
VladislavS писал(а):
SvetlAlex, чудес не бывает. Компилятор делает ровно то что вы ему написали. Ничего он предугадывать не может, не валите с больной головы на здоровую. Ищите ошибку в коде.

Ну а что ещё остаётся делать :)) Переделал функцию поиска свободного мэйлбокса. Так, чтобы каждую отправку bxCan по возможности пытался использовать мэйлбокс следующий по счёту, а не текущий. Первая посылка - mailbox0, вторая - mailbox2 и т д... Всё заработало, но это похоже на какой-то костыль (кажется, это так называется).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 30 июн 2019, 18:50 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4601
Откуда: КЧР, поселок Нижний Архыз
Вот здесь я использую CAN на STM32F042. Косяков никаких не замечено.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 30 июн 2019, 21:23 
Здравствуйте!

Зарегистрирован: 29 июн 2019, 19:03
Сообщения: 3
Откуда: Красноярск
Eddy_Em писал(а):
Вот здесь я использую CAN на STM32F042. Косяков никаких не замечено.

Спасибо! Помогло.

Код:
CAN_status can_send(uint8_t *msg, uint8_t len, uint16_t target_id){
    if(!noLED) LED_on(LED1); // turn ON LED1 at first data sent/receive
    uint8_t mailbox = 0;
    // check first free mailbox
    if(CAN->TSR & (CAN_TSR_TME)){
        mailbox = (CAN->TSR & CAN_TSR_CODE) >> 24;
    }else{ // no free mailboxes
        return CAN_BUSY;
    }


Вот эта проверка криво срабатывала, если на высокой скорости слать сообщения сплошным потоком :(( Переписал так, чтобы каждую новую посылку старалось сначала класть в последующий мэйлбокс. Так заработало. Костыль?! :(((


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 01 июл 2019, 13:50 
Старожил

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 225
SvetlAlex, так переделайте как вам надо. Если вы шлете быстрее, чем сообщения физически уходят, ну подождите свободный mailbox, а не уходите с "return CAN_BUSY;"
Подождать, это не обязательно в while() стоять, можно организовать отправку через прерывания. У CAN есть прерывание по свободному mailbox:

The transmit interrupt can be generated by the following events:
– Transmit mailbox 0 becomes empty, RQCP0 bit in the CAN_TSR register set.
– Transmit mailbox 1 becomes empty, RQCP1 bit in the CAN_TSR register set.
– Transmit mailbox 2 becomes empty, RQCP2 bit in the CAN_TSR register set.

Можно его и использовать. В прерывании отправляете очередное сообщение и смотрите, есть ли еще. Как отправили последнее, прерывание отключаете.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 01 июл 2019, 13:57 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4601
Откуда: КЧР, поселок Нижний Архыз
Можно создать простенькую очередь и заполнять ее сообщениями, а как mailbox освободится, передавать очередное сообщение (это можно делать либо по прерыванию, либо в основном цикле периодически запускать can_send и продвигать указатель на следующее неотосланное сообщение, если возвращает OK.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компилятор самовольно предзаполняет регистры посылок bxCan
СообщениеДобавлено: 01 июл 2019, 14:01 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1433
Ну вот, а то компилятор, компилятор.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: AstraHard, cheblin


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB