Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f103 can шина
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
aneox
прошу помощи
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 отправка работает, получаю свое же сообщение, но нога не дрыгается. В режиме нормал работает только получение пакетов с кан шины авто. Уже сил моих нет.
A. Fig Lee
А почему:
Код
GPIO_Mode_Out_PP
для ТХ?
Разве не альтернативную функцию включать надо?
aneox
Все верно, должно быть af, это я уже от безисходности поставил в последний раз) и так и так не работает
A. Fig Lee
Цитата(aneox @ Feb 10 2015, 14:20) *
Все верно, должно быть af, это я уже от безисходности поставил в последний раз) и так и так не работает

Ноги правильные? Ремап не пропущен?
aneox
ноги правильные, ремап на pb8-9 пробовал, тоже самое
AHTOXA
Тактирование AFIO включили?
aneox
Ну когда ремап делал, включал, сейчас нет
Golikov A.
как контролируете что нет передачи? осциллографом или потому что ящик не освобождается?
Если по ящику, то когда в сети одно устройство, и некому подтвердить что данные ушли ящик не освободиться и посылка будет регулярно повторятся...

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

Если бы были проблемы с шиной, getLastErrorCode давал бы 0x50 bitDominantError. Это я наблюдал в начале, потом выпаял все подтяжки на плате, там был распаян юсб, сейчас все проверено и getLastErrorCode говорит noError
aneox
Цитата(AHTOXA @ Feb 10 2015, 20:39) *
Тактирование AFIO включили?


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

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

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


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

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



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

хотя встречал много примеров в сети использования такой связки( мож с процом чтото, нога померла или еще чего, пойду светодиод прикручу поморгаю ей
qwqw
3.3В импульса должно хватать для MCP2551. <0.8В и >2В пороги.

В режиме LoopBack заворот внутренний. Нет смысла смотреть ножки и играть с резисторами.
Попробуйте в нормальном режиме замкнуть CAN_TX и CAN_RX (которые м-у контроллером и MCP2551).
Если не заработает, отпаять/поднять ножку TXD MCP2551. Вдруг она держит ногу контроллера.
aneox
на сколько я знаю в режиме лупбак наружу тх ногой должен дрыгать, а вот в режиме сайлентЛупбак полная изоляция.

Вообщем выпаял трансивер, делаю так
Код
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)
  {
  }
}


ни на одной ноге не горит светодиод, что не так то или финит аля комедия?
qwqw
А что за плата?
Может проблема с питанием, и периферия не работает.
aneox
вру я, вру
GPIO_Pin_12 и GPIO_PinSource12 оказывается разные вещи, а я почем знал) мне что автодополнение подсунуло в креаторе, то я и оставил) сейчас перепишу и попробую с кан

smile3046.gif ЗАРАБОТАЛО 1111493779.gif
на трех форумах кипишь навел) никто не заметил) GPIO_Pin_12 и GPIO_PinSource12 laughing.gif

но этот форум самый отзывчивый оказался, спасибо всем за помощь biggrin.gif
Nimnul22
aneox дайте пожалуйста ваш Skype или Mail, личное сообщение послать пока количество постов не позволяет! Есть пару вопросов и предложение.
Мои реквезиты:
nimnulaudio@mail.ru
Skype - Nimnul22
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.