реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> stm32f103 can шина, помогите сил нет
aneox
сообщение Feb 10 2015, 17:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



прошу помощи
stm32f103 + mcp2551 подключены к автомобильной кан шине, пакеты получаю успешно в прерывании, а вот отправка ни в какую не работает, ножка PA12(CANTX) молчит, в верхем положении.

Инициализация
CODE
void CAN1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);



RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );

//CAN_RX
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11; //PA11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//CAN_TX
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource12; //PA12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);


RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
CAN_DeInit(CAN1);

CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

//расчет на 500кб
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
CAN_InitStructure.CAN_Prescaler = 12;
CAN_Init(CAN1, &CAN_InitStructure);

CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);


TxMessage.StdId = 0x321;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 8;

CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}


Отправка
Код
        TxMessage.StdId=PID_REQUEST;
        TxMessage.RTR = CAN_RTR_DATA;
        TxMessage.IDE = CAN_ID_STD;
        TxMessage.DLC = 8;
        TxMessage.Data[0] = 0x02;
        TxMessage.Data[1] = 0x01;
        TxMessage.Data[2] = ENGINE_COOLANT_TEMP;
        TxMessage.Data[3] = 0x00;
        TxMessage.Data[4] = 0x00;
        TxMessage.Data[5] = 0x00;
        TxMessage.Data[6] = 0x00;
        TxMessage.Data[7] = 0x00;

        do
        {
            transmit_mailbox = CAN_Transmit( CAN1, &TxMessage );
        }
        while( transmit_mailbox =! CAN_NO_MB );

        txStat1 = CAN_TransmitStatus(CAN1, 0); //0x02 CAN_TxStatus_Pending
        txStat2 = CAN_TransmitStatus(CAN1, 1); //0x02 CAN_TxStatus_Pending
        txStat3 = CAN_TransmitStatus(CAN1, 2); //0x02 CAN_TxStatus_Pending

        if (txStat1 == CANTXOK || txStat2 == CANTXOK || txStat3 == CANTXOK)
            ok = 1;


Заполняет все мэил боксы и так и стоит. В режиме Loopback отправка работает, получаю свое же сообщение, но нога не дрыгается. В режиме нормал работает только получение пакетов с кан шины авто. Уже сил моих нет.

Сообщение отредактировал IgorKossak - Feb 10 2015, 18:48
Причина редактирования: [codebox] для длинного кода, [code] - для короткого
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 10 2015, 18:43
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



А почему:
Код
GPIO_Mode_Out_PP
для ТХ?
Разве не альтернативную функцию включать надо?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
aneox
сообщение Feb 10 2015, 19:20
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



Все верно, должно быть af, это я уже от безисходности поставил в последний раз) и так и так не работает
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 10 2015, 19:23
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(aneox @ Feb 10 2015, 14:20) *
Все верно, должно быть af, это я уже от безисходности поставил в последний раз) и так и так не работает

Ноги правильные? Ремап не пропущен?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
aneox
сообщение Feb 10 2015, 19:24
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



ноги правильные, ремап на pb8-9 пробовал, тоже самое
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 10 2015, 19:39
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Тактирование AFIO включили?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aneox
сообщение Feb 10 2015, 19:46
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



Ну когда ремап делал, включал, сейчас нет
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 10 2015, 20:39
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



как контролируете что нет передачи? осциллографом или потому что ящик не освобождается?
Если по ящику, то когда в сети одно устройство, и некому подтвердить что данные ушли ящик не освободиться и посылка будет регулярно повторятся...

и никто ножку не зажал в верхнем положении, это вроде как признак что шина занята или нет?
Go to the top of the page
 
+Quote Post
aneox
сообщение Feb 11 2015, 04:19
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



Все тесты проводил с подключением к шине авто. Ноги смотрю лог анализатором на базе ардуины. На canrx отчетливо вижу импульсы. На счет того что авто не отдает ack подтверждение тоже думал. Но если всетаки пакет ушел, то должен придти ответ с данными, а его нет. Ноги никто больше не занимает. Беда прям какаято.

Если бы были проблемы с шиной, getLastErrorCode давал бы 0x50 bitDominantError. Это я наблюдал в начале, потом выпаял все подтяжки на плате, там был распаян юсб, сейчас все проверено и getLastErrorCode говорит noError

Сообщение отредактировал aneox - Feb 11 2015, 04:09
Go to the top of the page
 
+Quote Post
aneox
сообщение Feb 11 2015, 05:35
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



Цитата(AHTOXA @ Feb 10 2015, 20:39) *
Тактирование AFIO включили?


сегодня проверил без ремапа, затактировал RCC_APB2Periph_AFIO, результат тот же, данные получаю, отправить не могу

Уже не знаю куда смотреть. Переписать все на hal или грешить на железо. Есть в наличии такие же камни только в другом корпусе, травить плату для проверки, времени много отнимет(

Цитата(Golikov A. @ Feb 10 2015, 21:39) *
это вроде как признак что шина занята или нет?


линия rx в промежутках между импульсами тоже вверху, думаю это свободное состояние
Go to the top of the page
 
+Quote Post
qwqw
сообщение Feb 11 2015, 07:08
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-11-05
Из: г. Москва
Пользователь №: 11 307



Когда успешно принимаете пакет, ACK от вас тоже не выставляется?
Go to the top of the page
 
+Quote Post
aneox
сообщение Feb 11 2015, 07:40
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



Цитата(qwqw @ Feb 11 2015, 08:08) *
Когда успешно принимаете пакет, ACK от вас тоже не выставляется?

если в режиме loopback то выставляется, tx status = ok



кое что нащюпал, убрал питание с mcp2551 трансивера, ноги опустились, перевел в режим лупбак, отключил от авто, начал слать сам себе. Беру резистор 100ком, на кантх и к 3.3в, а нога то внизу, чето шлет думаю, беру резистор 4.7ком вместо сотки, и начинаю наблюдать какието импульсы на ноге, но в то же время импульсы появились и на canrx, хотя их там не должно быть. Куда копать дальше не знаю. mcp2551 питается от 5в, мож ей всетаки не хватает 3,3 импульса с стма?

хотя встречал много примеров в сети использования такой связки( мож с процом чтото, нога померла или еще чего, пойду светодиод прикручу поморгаю ей
Go to the top of the page
 
+Quote Post
qwqw
сообщение Feb 11 2015, 07:49
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-11-05
Из: г. Москва
Пользователь №: 11 307



3.3В импульса должно хватать для MCP2551. <0.8В и >2В пороги.

В режиме LoopBack заворот внутренний. Нет смысла смотреть ножки и играть с резисторами.
Попробуйте в нормальном режиме замкнуть CAN_TX и CAN_RX (которые м-у контроллером и MCP2551).
Если не заработает, отпаять/поднять ножку TXD MCP2551. Вдруг она держит ногу контроллера.
Go to the top of the page
 
+Quote Post
aneox
сообщение Feb 11 2015, 08:24
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 10-02-15
Пользователь №: 85 066



на сколько я знаю в режиме лупбак наружу тх ногой должен дрыгать, а вот в режиме сайлентЛупбак полная изоляция.

Вообщем выпаял трансивер, делаю так
Код
int main(void)
{

  SystemInit();

  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE );
  GPIO_InitStructure.GPIO_Pin = GPIO_PinSource12 | GPIO_PinSource11 | GPIO_PinSource10 | GPIO_PinSource15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_PinSource3 | GPIO_PinSource8 | GPIO_PinSource9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_PinSource15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_SetBits(GPIOA, GPIO_PinSource12);
  GPIO_SetBits(GPIOA, GPIO_PinSource11);
  GPIO_SetBits(GPIOA, GPIO_PinSource10);
  GPIO_SetBits(GPIOA, GPIO_PinSource15);

  GPIO_SetBits(GPIOB, GPIO_PinSource3);
  GPIO_SetBits(GPIOB, GPIO_PinSource8);
  GPIO_SetBits(GPIOB, GPIO_PinSource9);

  GPIO_SetBits(GPIOC, GPIO_PinSource15);


  while (1)
  {
  }
}


ни на одной ноге не горит светодиод, что не так то или финит аля комедия?
Go to the top of the page
 
+Quote Post
qwqw
сообщение Feb 11 2015, 09:35
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-11-05
Из: г. Москва
Пользователь №: 11 307



А что за плата?
Может проблема с питанием, и периферия не работает.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016