Кан заработал. Может кому понадобится код. Для stm32F0xx Шапка программы:
#include "stm32f0xx.h" #include "stm32f0xx_can.h" CanTxMsg TxMessage = {0}; uint8_t
CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_
DATA6,CAN_DATA7; uint16_t CAN_ID; CAN_InitTypeDef CAN_InitStructure;
void Configure_GPIO_CAN(void); void Configure_CAN(void); void delay_ms(uint16_t time); void delay_us(uint16_t time); void LEDS_INIT(void); void LED_1_RED(int a); void LED_2_YELLOW(int a); void LED_3_GREEN(int a); void LED_4_BLUE(int a); void KNOPS_INIT(void); int KNOPS_1(void); int KNOPS_2(void); int KNOPS_3(void); int KNOPS_4(void); #define CMD_TOGGLE (0xDA) #define CAN_ID_MASK (0xFF70U) #define CAN_ID1 (0x651U) #define CAN_ID2 (0x652U) Инициализация ножек CAN //*****************************************************НОГИ КАНА __INLINE void Configure_GPIO_CAN(void) { RCC->AHBENR |= RCC_AHBENR_GPIOAEN; RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER11 |
GPIO_MODER_MODER12))\ | (GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1); GPIOA->AFR[1] = (GPIOA->AFR[1] &~ (GPIO_AFRH_AFR11 |
GPIO_AFRH_AFR12))\ | (4 << (3 * 4)) | (4 << (4 * 4)); } //*****************************************************НОГИ КАНА
//****************************************************КОНФИГУРАЦ
ИЯ КАНА __INLINE void Configure_CAN(void) { RCC->APB1ENR |= RCC_APB1ENR_CANEN; CAN->MCR |= CAN_MCR_INRQ; while((CAN->MSR & CAN_MSR_INAK)!=CAN_MSR_INAK) { } CAN->MCR &=~CAN_MCR_SLEEP ; CAN_StructInit(&CAN_InitStructure); CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; CAN_InitStructure.CAN_Prescaler = 5; CAN_Init(CAN, &CAN_InitStructure); CAN->MCR &=~ CAN_MCR_INRQ; while((CAN->MSR & CAN_MSR_INAK)==CAN_MSR_INAK) { }
CAN->sFilterRegister[0].FR1 = 0; /* (11) */
CAN->FMR = CAN_FMR_FINIT; CAN->FA1R = CAN_FA1R_FACT0; CAN->FMR &=~ CAN_FMR_FINIT; CAN->IER |= CAN_IER_FMPIE0; NVIC_SetPriority(CEC_CAN_IRQn, 0); NVIC_EnableIRQ(CEC_CAN_IRQn); } //****************************************************КОНФИГУРАЦ
ИЯ КАНА
//**************************************************Отправка
строки по CAN void CAN_WRITE_DATA(int number_id,char str[8]) { TxMessage.StdId =number_id; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage.Data[0] = str[0]; TxMessage.Data[1] = str[1]; TxMessage.Data[2] = str[2]; TxMessage.Data[3] = str[3]; TxMessage.Data[4] = str[4]; TxMessage.Data[5] = str[5]; TxMessage.Data[6] = str[6]; TxMessage.Data[7] = str[7]; CAN_Transmit(CAN,&TxMessage); } //**************************************************Отправка
строки по CAN
Бесконечный цикл с опросом кнопок
while (1){ delay_ms(500); if (KNOPS_1()==0) CAN_WRITE_DATA(1000,"YURIK"); if (KNOPS_2()==0) CAN_WRITE_DATA(1001,"DURIK"); } }
Прерывание по приему CAN
void CEC_CAN_IRQHandler(void) { CanRxMsg RxMessage; CAN_Receive(CAN,CAN_FIFO0, &RxMessage); CAN_ID=RxMessage.StdId; CAN_DATA0=RxMessage.Data[0]; CAN_DATA1=RxMessage.Data[1]; CAN_DATA2=RxMessage.Data[2]; CAN_DATA3=RxMessage.Data[3]; CAN_DATA4=RxMessage.Data[4]; CAN_DATA5=RxMessage.Data[5]; CAN_DATA6=RxMessage.Data[6]; CAN_DATA7=RxMessage.Data[7]; CAN_ClearITPendingBit(CAN,CAN_IT_FMP0);
if (RxMessage.Data[0]=='Y') LED_1_RED(1),LED_2_YELLOW(1),
LED_3_GREEN(0),LED_4_BLUE(0); if (RxMessage.Data[0]=='D') LED_1_RED(0),LED_2_YELLOW(0),
LED_3_GREEN(1),LED_4_BLUE(1); if (RxMessage.Data[0]=='L') LED_1_RED(1),LED_2_YELLOW(1),
LED_3_GREEN(1),LED_4_BLUE(1); if (RxMessage.Data[0]=='P') LED_1_RED(0),LED_2_YELLOW(0),
LED_3_GREEN(0),LED_4_BLUE(0); }
Всем спасибо за помощь!
|