Ich versuche die CAN-Kommunikation für STM32F407IG sicherherzustellen, in dem Daten von CAN gesendet werden. Mein Code enthält aber bestimmt eine Fehler, da die Überprüfung durch die Diodenbeleuchtung gescheitert ist. kann mir evtl. jemand helfen die Fehler zu suchen ? Wie kann man am besten die CAN-Kommunikation testen ? Vielen Dank Mein Code: #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_can.h" #include "misc.h" #include "stm32f4xx.h" GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; uint8_t Status = 0; uint8_t TransmitMailbox = 0; void CAN_send (void) { SystemInit(); STM_EVAL_LEDInit(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;// Mode IPU (input) ?! GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_CAN1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_CAN1); CAN_InitStructure.CAN_Prescaler = 2; CAN_InitStructure.CAN_SJW = CAN_SJW_2tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_11tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = ENABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_Init(CAN1, &CAN_InitStructure); /* CAN_Filter_int */ CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0123 << 5; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* CAN_Transmit */ CanTxMsg TxMessage; TxMessage.StdId = 0x123; TxMessage.ExtId = 0; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage.Data[0] = 4; TxMessage.Data[1] = 4; TransmitMailbox = CAN_Transmit(CANx, &TxMessage); Status= (CAN_TransmitStatus(CANx, TransmitMailbox); if (Status == CAN_TxStatus_Ok) {STM_EVAL_LEDOn (LED1); } else STM_EVAL_LEDOn (LED2); while(1) {} }
Testen geht ganz gut mit nem PCAN, oder mein neuer liebling isCAN USB. Das Teil ist was Handhabung der Libs a ngeht genial. Ein Logiganalyzer würde auch schon helfen, um zu sehen ob überhaupt was passiert. Prinzipiell sei zum Canbus noch gesagt, dass du zum Testen min. einen Weiteren Teilnehmer hast, der fleißig ein ack sendet, sonst schaltet sich dein Controllen nach einigen "Fehlversuchen" ab. Benutzt du Tranceiver? Musst du nämlich ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.