Перейти к содержанию
    

прошу помощи

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

 

Инициализация

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
[codebox] для длинного кода, [code] - для короткого

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему:

GPIO_Mode_Out_PP

для ТХ?

Разве не альтернативную функцию включать надо?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все верно, должно быть af, это я уже от безисходности поставил в последний раз) и так и так не работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все верно, должно быть af, это я уже от безисходности поставил в последний раз) и так и так не работает

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как контролируете что нет передачи? осциллографом или потому что ящик не освобождается?

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

 

и никто ножку не зажал в верхнем положении, это вроде как признак что шина занята или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем aneox

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

это вроде как признак что шина занята или нет?

 

линия rx в промежутках между импульсами тоже вверху, думаю это свободное состояние

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда успешно принимаете пакет, ACK от вас тоже не выставляется?

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

 

 

 

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

 

хотя встречал много примеров в сети использования такой связки( мож с процом чтото, нога померла или еще чего, пойду светодиод прикручу поморгаю ей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В режиме LoopBack заворот внутренний. Нет смысла смотреть ножки и играть с резисторами.

Попробуйте в нормальном режиме замкнуть CAN_TX и CAN_RX (которые м-у контроллером и MCP2551).

Если не заработает, отпаять/поднять ножку TXD MCP2551. Вдруг она держит ногу контроллера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Вообщем выпаял трансивер, делаю так

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)
  {
  }
}

 

ни на одной ноге не горит светодиод, что не так то или финит аля комедия?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что за плата?

Может проблема с питанием, и периферия не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...