aneox 0 10 февраля, 2015 Опубликовано 10 февраля, 2015 (изменено) · Жалоба прошу помощи 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 отправка работает, получаю свое же сообщение, но нога не дрыгается. В режиме нормал работает только получение пакетов с кан шины авто. Уже сил моих нет. Изменено 10 февраля, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 10 февраля, 2015 Опубликовано 10 февраля, 2015 · Жалоба А почему: GPIO_Mode_Out_PP для ТХ? Разве не альтернативную функцию включать надо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aneox 0 10 февраля, 2015 Опубликовано 10 февраля, 2015 · Жалоба Все верно, должно быть af, это я уже от безисходности поставил в последний раз) и так и так не работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 10 февраля, 2015 Опубликовано 10 февраля, 2015 · Жалоба Все верно, должно быть af, это я уже от безисходности поставил в последний раз) и так и так не работает Ноги правильные? Ремап не пропущен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aneox 0 10 февраля, 2015 Опубликовано 10 февраля, 2015 · Жалоба ноги правильные, ремап на pb8-9 пробовал, тоже самое Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 10 февраля, 2015 Опубликовано 10 февраля, 2015 · Жалоба Тактирование AFIO включили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aneox 0 10 февраля, 2015 Опубликовано 10 февраля, 2015 · Жалоба Ну когда ремап делал, включал, сейчас нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 10 февраля, 2015 Опубликовано 10 февраля, 2015 · Жалоба как контролируете что нет передачи? осциллографом или потому что ящик не освобождается? Если по ящику, то когда в сети одно устройство, и некому подтвердить что данные ушли ящик не освободиться и посылка будет регулярно повторятся... и никто ножку не зажал в верхнем положении, это вроде как признак что шина занята или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aneox 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 (изменено) · Жалоба Все тесты проводил с подключением к шине авто. Ноги смотрю лог анализатором на базе ардуины. На canrx отчетливо вижу импульсы. На счет того что авто не отдает ack подтверждение тоже думал. Но если всетаки пакет ушел, то должен придти ответ с данными, а его нет. Ноги никто больше не занимает. Беда прям какаято. Если бы были проблемы с шиной, getLastErrorCode давал бы 0x50 bitDominantError. Это я наблюдал в начале, потом выпаял все подтяжки на плате, там был распаян юсб, сейчас все проверено и getLastErrorCode говорит noError Изменено 11 февраля, 2015 пользователем aneox Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aneox 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 · Жалоба Тактирование AFIO включили? сегодня проверил без ремапа, затактировал RCC_APB2Periph_AFIO, результат тот же, данные получаю, отправить не могу Уже не знаю куда смотреть. Переписать все на hal или грешить на железо. Есть в наличии такие же камни только в другом корпусе, травить плату для проверки, времени много отнимет( это вроде как признак что шина занята или нет? линия rx в промежутках между импульсами тоже вверху, думаю это свободное состояние Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_Fry 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 · Жалоба Когда успешно принимаете пакет, ACK от вас тоже не выставляется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aneox 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 · Жалоба Когда успешно принимаете пакет, ACK от вас тоже не выставляется? если в режиме loopback то выставляется, tx status = ok кое что нащюпал, убрал питание с mcp2551 трансивера, ноги опустились, перевел в режим лупбак, отключил от авто, начал слать сам себе. Беру резистор 100ком, на кантх и к 3.3в, а нога то внизу, чето шлет думаю, беру резистор 4.7ком вместо сотки, и начинаю наблюдать какието импульсы на ноге, но в то же время импульсы появились и на canrx, хотя их там не должно быть. Куда копать дальше не знаю. mcp2551 питается от 5в, мож ей всетаки не хватает 3,3 импульса с стма? хотя встречал много примеров в сети использования такой связки( мож с процом чтото, нога померла или еще чего, пойду светодиод прикручу поморгаю ей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_Fry 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 · Жалоба 3.3В импульса должно хватать для MCP2551. <0.8В и >2В пороги. В режиме LoopBack заворот внутренний. Нет смысла смотреть ножки и играть с резисторами. Попробуйте в нормальном режиме замкнуть CAN_TX и CAN_RX (которые м-у контроллером и MCP2551). Если не заработает, отпаять/поднять ножку TXD MCP2551. Вдруг она держит ногу контроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aneox 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 · Жалоба на сколько я знаю в режиме лупбак наружу тх ногой должен дрыгать, а вот в режиме сайлентЛупбак полная изоляция. Вообщем выпаял трансивер, делаю так 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) { } } ни на одной ноге не горит светодиод, что не так то или финит аля комедия? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_Fry 0 11 февраля, 2015 Опубликовано 11 февраля, 2015 · Жалоба А что за плата? Может проблема с питанием, и периферия не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться