/** * @brief This function handles CAN request. * @param None * @retval None */ void CEC_CAN_IRQHandler(void) { if (CAN_MessagePending(CANx, CAN_FIFO0) != 0) { /* Set the LCD Back Color */ LCD_SetBackColor(Green); /* Set the LCD Text Color */ LCD_SetTextColor(Black); /* Displays MESSAGE1 on line 1 */ LCD_DisplayStringLine(LINE(6), (uint8_t *)MESSAGE1); CAN_Receive(CANx, CAN_FIFO0, &RxMessage); LED_Display(RxMessage.Data[0]); KeyNumber = RxMessage.Data[0]; } if (CAN_MessagePending(CANx, CAN_FIFO1) != 0) { /* Set the LCD Back Color */ LCD_SetBackColor(Cyan); /* Set the LCD Text Color */ LCD_SetTextColor(Black); /* Displays MESSAGE1 on line 1 */ LCD_DisplayStringLine(LINE(6), (uint8_t *)MESSAGE2); CAN_Receive(CANx, CAN_FIFO1, &RxMessage1); LED_Display(RxMessage1.Data[0]); KeyNumber = RxMessage1.Data[0]; } }
TestStatus CAN_RX(void) { u32 iCANRX = 0; iCANRX= 0; while((CAN_MessagePending(CAN1,CAN_FIFO0) < 1) && (iCANRX != 0xFF)) { iCANRX++; } if(iCANRX!=0xFF) { /* receive */ RxMessageData.Data[0]=0x00; RxMessageData.Data[1]=0x00; RxMessageData.Data[2]=0x00; RxMessageData.Data[3]=0x00; RxMessageData.Data[4]=0x00; RxMessageData.Data[5]=0x00; RxMessageData.Data[6]=0x00; RxMessageData.Data[7]=0x00; CAN_Receive(CAN1,CAN_FIFO0, &RxMessageData); return PASSED; } else return FAILED; }
int platform_can_recv( unsigned id, u32 *canid, u8 *idtype, u8 *len, u8 *data ) { CanRxMsg RxMessage; const char *s; char *d; if( CAN_MessagePending( CAN1, CAN_FIFO0 ) > 0 ) { CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); if( RxMessage.IDE == CAN_ID_STD ) { *canid = ( u32 )RxMessage.StdId; *idtype = ELUA_CAN_ID_STD; } else { *canid = ( u32 )RxMessage.ExtId; *idtype = ELUA_CAN_ID_EXT; } *len = RxMessage.DLC; s = ( const char * )RxMessage.Data; d = ( char* )data; DUFF_DEVICE_8( RxMessage.DLC, *d++ = *s++ ); return PLATFORM_OK; } else return PLATFORM_UNDERFLOW; }
void platform_can_recv( unsigned id, u32 *canid, u8 *idtype, u8 *len, u8 *data ) { CanRxMsg RxMessage; const char *s; char *d; u32 i = 0; // Check up to 256 times for message while( ( CAN_MessagePending(CAN1, CAN_FIFO0) < 1 ) && ( i++ != 0xFF ) ); RxMessage.StdId=0x00; RxMessage.IDE=CAN_ID_STD; RxMessage.DLC=0; RxMessage.Data[0]=0x00; RxMessage.Data[1]=0x00; CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); if( RxMessage.IDE == CAN_ID_STD ) { *canid = ( u32 )RxMessage.StdId; *idtype = 0; } else { *canid = ( u32 )RxMessage.ExtId; *idtype = 1; } *len = RxMessage.DLC; s = ( const char * )RxMessage.Data; d = ( char* )data; DUFF_DEVICE_8( RxMessage.DLC, *d++ = *s++ ); }
/******************************************************************************* * Function Name : CAN1_RX1_IRQHandler * Description : This function handles CAN1 RX1 request. * Input : None * Output : None * Return : None *******************************************************************************/ void CAN1_RX1_IRQHandler(void) { if(CAN_GetITStatus(CAN1,CAN_IT_FMP1)== SET) { // if(Bridge.CAN_State!= CAN_PROC_MSGINQUEUE && Bridge.CAN_State!= CAN_PROCESSING ) //{ CAN_Receive(CAN1, CAN_FIFO1, &Bridge.RxMessage1); CANpacket_receive=1; Bridge.CAN_State=ChangeState_level_Busier(Bridge.CAN_State); //CAN_ClearITPendingBit(CAN1, CAN_IT_FMP1) //Don't need this line the intterruption is cleared automatically when read /* } else { Bridge.CAN_Err.ErrorId=CAN_FULLQUEUE; Bridge.CAN_Err.ErrorData= 0; }*/ } else { /*This case has to be treated as an important problem of using the multiport communication: The priority of the CAN communication have to be modified after tests or make an automated algorithm that (numerically ) */ if(CAN_GetITStatus(CAN1,CAN_FLAG_FF1)== SET) { //CAN_ClearITPendingBit( CAN1,CAN_FLAG_FF1); Bridge.CAN_Err.ErrorId=CAN_OVERFLOW; Bridge.CAN_Err.ErrorData=CAN_MessagePending( CAN1,CAN_FIFO1); } /*Interrupt when error iss reported by the CAN BUS controller*/ else if(CAN_GetITStatus(CAN1,CAN_IT_ERR)== SET) { Bridge.CAN_Err.ErrorId=CAN_RCVERR; Bridge.CAN_Err.ErrorData=CAN_GetLastErrorCode(CAN1); } } }
int can_erecv(int rfifo, can_msg_t *msg) { #if ENABLE_CAN_INT if (circle_number == 0) { return -1; } else { (*msg) = can_fifo_rx[circle_tailer]; circle_number --; circle_tailer ++; if (circle_tailer == RX_FIFO_SZ) circle_tailer = 0; } return 0; #else CanRxMsg msg_st; uint8_t rxfifo = (rfifo == 0) ? CAN_FIFO0 : CAN_FIFO1; if(CAN_MessagePending(CAN1, rxfifo) > 0) CAN_Receive(CAN1, rxfifo, &msg_st); else return -1; msg->id = (msg_st.IDE == CAN_ID_EXT) ? msg_st.ExtId : msg_st.StdId; msg->flag = (msg_st.IDE == CAN_ID_EXT) ? CAN_FLAG_EXT : 0; msg->dlc = msg_st.DLC; memcpy(msg->data, msg_st.Data, msg->dlc); return 0; #endif }
void CAN1_Send(uint32_t ID,u8 *Data) { u8 TransmitMailbox=0,i=0; CanTxMsg TxMessage; TxMessage.StdId = ID; TxMessage.ExtId = 0x0000; TxMessage.IDE = CAN_ID_STD; TxMessage.RTR = CAN_RTR_DATA; TxMessage.DLC = 8; for(i=0;i<8;i++) { TxMessage.Data[i] = *Data++; } TransmitMailbox=CAN_Transmit(CAN1,&TxMessage); while((CAN_TransmitStatus(CAN1,TransmitMailbox)!=CANTXOK)&&(i!=0xFF)) { i++; } i=0; while((CAN_MessagePending(CAN1,CAN_FIFO0)<1)&&(i!=0xFF)) { i++; } }
TestStatus CAN_RX(void) { u32 iCANRX = 0; iCANRX= 0; while((CAN_MessagePending(CAN1,CAN_FIFO0) < 1) && (iCANRX != 0xFF)) { iCANRX++; } if(iCANRX!=0xFF) { /* receive */ RxMessageData.Data[0]=0x00; RxMessageData.Data[1]=0x00; RxMessageData.Data[2]=0x00; RxMessageData.Data[3]=0x00; RxMessageData.Data[4]=0x00; RxMessageData.Data[5]=0x00; RxMessageData.Data[6]=0x00; RxMessageData.Data[7]=0x00; CAN_Receive(CAN1,CAN_FIFO0, &RxMessageData); /*rt_kprintf("\r\nRxMessage="); for(iCANRX=0;iCANRX<RxMessageData.DLC;iCANRX++) rt_kprintf("%X ",RxMessageData.Data[iCANRX]);*/ return PASSED; } else return FAILED; }
void CAN_FlushReceiveFifo() { CanRxMsg RxMessage; while (CAN_MessagePending(CAN_FIFO0)) { CAN_Receive(CAN_FIFO0, &RxMessage); } }
//can口接收数据查询 //buf:数据缓存区; //返回值:0,无数据被收到; // 其他,接收的数据长度; u8 Can_Receive_Msg(u8* buf) { u32 i; CanRxMsg RxMessage; if ( CAN_MessagePending(CAN1, CAN_FIFO0) == 0)return 0; //没有接收到数据,直接退出 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据 for (i = 0; i < 8; i++) buf[i] = RxMessage.Data[i]; return RxMessage.DLC; }
//can口接收数据查询 //buf:数据缓存区; //返回值:0,无数据被收到; // 其他,接收的数据长度; uint8_t DST_CAN_1::Receive_CAN1_MSG(uint8_t *buf) { u32 i; CanRxMsg RxMessage; //★关联FIFO0★ if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;//没有接收到数据,直接退出 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据 for(i=0;i<RxMessage.DLC;i++) buf[i]=RxMessage.Data[i]; return RxMessage.DLC; }
void CAN1_RX0_IRQHandler(void) #endif { if( CAN_MessagePending(CAN1, CAN_FIFO0) ) // message pending ? { CanRxMsg CAN_RxMsg; // read the message CAN_Receive( CAN1, CAN_FIFO0, &CAN_RxMsg); // parse the message signals CAN_RxParseFrame( &MultilinkCAN, &CAN_RxMsg ); } }
void USB_LP_CAN1_RX0_IRQHandler(void) { if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) == RESET) { return; } CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); //GPIO_ResetBits(GPIOA, GPIO_Pin_8); CanRxMsg message; while(CAN_MessagePending(CAN1, 0)) { CAN_Receive(CAN1, 0, &message); } if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8) == Bit_SET) { GPIO_ResetBits(GPIOA, GPIO_Pin_8); } else { GPIO_SetBits(GPIOA, GPIO_Pin_8); } }
//for can1 receive FIFO 0 interrupt void USB_LP_CAN1_RX0_IRQHandler(void) { CanRxMsg msg_st; CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); while (CAN_MessagePending(CAN1, CAN_FIFO0)) { CAN_Receive(CAN1, CAN_FIFO0, &msg_st); circle_number ++; #if CONFIG_CAN1_FIFO_OVERRIDE can_fifo_rx[circle_header].id = (msg_st.IDE == CAN_ID_EXT) ? msg_st.ExtId : msg_st.StdId; can_fifo_rx[circle_header].flag = (msg_st.IDE == CAN_ID_EXT) ? CAN_FLAG_EXT : 0; can_fifo_rx[circle_header].dlc = msg_st.DLC; memcpy(can_fifo_rx[circle_header].data, msg_st.Data, msg_st.DLC); if (circle_number == RX_FIFO_SZ) { circle_number --; circle_tailer++; if (circle_tailer == RX_FIFO_SZ) circle_tailer = 0; } circle_header ++; if (circle_header == RX_FIFO_SZ) circle_header = 0; #else if (circle_number == RX_FIFO_SZ) { circle_number --; return; } can_fifo_rx[circle_header].id = (msg_st.IDE == CAN_ID_EXT) ? msg_st.ExtId : msg_st.StdId; can_fifo_rx[circle_header].flag = (msg_st.IDE == CAN_ID_EXT) ? CAN_FLAG_EXT : 0; can_fifo_rx[circle_header].dlc = msg_st.DLC; memcpy(can_fifo_rx[circle_header].data, msg_st.Data, msg_st.DLC); circle_header ++; if (circle_header == RX_FIFO_SZ) circle_header = 0; #endif } }
int main(void) { CanTxMsg TxMessage; float X_offset =0.0f,Y_offset =0.0f,Z_offset =0.0f; float test_float=0.0f; uint8_t test_int=0; float GyX =0.0f, GyY =0.0f, GyZ =0.0f; float GyX_prev=0.0f,GyY_prev=0.0f,GyZ_prev=0.0f; uint16_t x_len=240; uint16_t y_len=320; uint16_t i=0; uint16_t buffer_screen[x_len][y_len]; /* For gyro receiving */ float receivedGyro1=0,receivedGyro1_prev=0; float receivedGyro2=0,receivedGyro2_prev=0; float receivedGyro3=0,receivedGyro3_prev=0; uint8_t *ptr = & receivedGyro1; // uint16_t *buf_ptr = &buffer_screen; float runner=-8.0; rectangular_t rect1; rectangular_t prev_rect; rectangular_t rect_screen; char lcd_text_main[100]; /* LCD Initialization */ lcd_init(); lcd_drawBackground(20,60,250); //lcd_drawBGPersimmon(20, 60, 250); /* LED Initialization */ LED_Initialization(); /* CAN Initialization */ CAN2_Config(); CAN2_NVIC_Config(); /* MEMS Initialization */ Demo_GyroConfig(); Delay_1us(10000); #define CALIBRATE_COUNT 1000 for (i=0;i<CALIBRATE_COUNT ;i++){ Demo_GyroReadAngRate (Buffer); X_offset+= Buffer[0]; Y_offset+= Buffer[1]; Z_offset+= Buffer[2]; } X_offset = X_offset/ (float)CALIBRATE_COUNT; Y_offset = Y_offset/ (float)CALIBRATE_COUNT; Z_offset = Z_offset/ (float)CALIBRATE_COUNT; rect_screen.xlen = x_len; rect_screen.ylen = y_len; rect_screen.xpos = 0; rect_screen.ypos = 0; #define NEEDLE_RADIUS 65 #define NEEDLE_BASE_WIDTH 14 #define NEEDLE_FRAME_THICKNESS 5 #define NEEDLE1_CENTER_X 80 #define NEEDLE1_CENTER_Y 100 #define NEEDLE2_CENTER_X 80 #define NEEDLE2_CENTER_Y 200 #define NEEDLE3_CENTER_X 80 #define NEEDLE3_CENTER_Y 300 /* Drawing Needle frame 1 */ LCD_SetLayer(LCD_BACKGROUND_LAYER); DrawThickCircle(NEEDLE1_CENTER_X ,NEEDLE1_CENTER_Y,NEEDLE_RADIUS+NEEDLE_FRAME_THICKNESS, 4,LCD_COLOR_BLACK,LCD_COLOR_WHITE-1); LCD_SetLayer(LCD_FOREGROUND_LAYER); DrawThickCircle(NEEDLE1_CENTER_X ,NEEDLE1_CENTER_Y,NEEDLE_BASE_WIDTH, 6,LCD_COLOR_BLACK,LCD_COLOR_WHITE-1); LCD_SetLayer(LCD_BACKGROUND_LAYER); LCD_SetColors(ASSEMBLE_RGB(20, 60, 250),LCD_COLOR_BLACK); LCD_DrawFullRect(NEEDLE1_CENTER_X- NEEDLE_RADIUS-NEEDLE_FRAME_THICKNESS*2,NEEDLE1_CENTER_Y+ NEEDLE_BASE_WIDTH+3,NEEDLE_RADIUS*2+NEEDLE_FRAME_THICKNESS*4,NEEDLE_RADIUS); LCD_SetLayer(LCD_FOREGROUND_LAYER); LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_BLACK); LCD_DrawFullRect(NEEDLE1_CENTER_X- NEEDLE_RADIUS,NEEDLE1_CENTER_Y+ NEEDLE_BASE_WIDTH,NEEDLE_RADIUS*2,NEEDLE_FRAME_THICKNESS-1); /* Drawing Needle frame 2 */ LCD_SetLayer(LCD_BACKGROUND_LAYER); DrawThickCircle(NEEDLE2_CENTER_X ,NEEDLE2_CENTER_Y,NEEDLE_RADIUS+NEEDLE_FRAME_THICKNESS, 4,LCD_COLOR_BLACK,LCD_COLOR_WHITE-1); LCD_SetLayer(LCD_FOREGROUND_LAYER); DrawThickCircle(NEEDLE2_CENTER_X ,NEEDLE2_CENTER_Y,NEEDLE_BASE_WIDTH, 6,LCD_COLOR_BLACK,LCD_COLOR_WHITE-1); LCD_SetLayer(LCD_BACKGROUND_LAYER); LCD_SetColors(ASSEMBLE_RGB(20, 60, 250),LCD_COLOR_BLACK); LCD_DrawFullRect(NEEDLE2_CENTER_X- NEEDLE_RADIUS-NEEDLE_FRAME_THICKNESS*2,NEEDLE2_CENTER_Y+ NEEDLE_BASE_WIDTH+3,NEEDLE_RADIUS*2+NEEDLE_FRAME_THICKNESS*4,NEEDLE_RADIUS); LCD_SetLayer(LCD_FOREGROUND_LAYER); LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_BLACK); LCD_DrawFullRect(NEEDLE2_CENTER_X- NEEDLE_RADIUS,NEEDLE2_CENTER_Y+ NEEDLE_BASE_WIDTH,NEEDLE_RADIUS*2,NEEDLE_FRAME_THICKNESS-1); /* Drawing Needle frame 2 */ LCD_SetLayer(LCD_BACKGROUND_LAYER); DrawThickCircle(NEEDLE3_CENTER_X ,NEEDLE3_CENTER_Y,NEEDLE_RADIUS+NEEDLE_FRAME_THICKNESS, 4,LCD_COLOR_BLACK,LCD_COLOR_WHITE-1); LCD_SetLayer(LCD_FOREGROUND_LAYER); DrawThickCircle(NEEDLE3_CENTER_X ,NEEDLE3_CENTER_Y,NEEDLE_BASE_WIDTH, 6,LCD_COLOR_BLACK,LCD_COLOR_WHITE-1); LCD_SetLayer(LCD_BACKGROUND_LAYER); LCD_SetColors(ASSEMBLE_RGB(20, 60, 250),LCD_COLOR_BLACK); LCD_DrawFullRect(NEEDLE3_CENTER_X- NEEDLE_RADIUS-NEEDLE_FRAME_THICKNESS*2,NEEDLE3_CENTER_Y+ NEEDLE_BASE_WIDTH+3,NEEDLE_RADIUS*2+NEEDLE_FRAME_THICKNESS*4,NEEDLE_RADIUS); LCD_SetLayer(LCD_FOREGROUND_LAYER); LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_BLACK); LCD_DrawFullRect(NEEDLE3_CENTER_X- NEEDLE_RADIUS,NEEDLE3_CENTER_Y+ NEEDLE_BASE_WIDTH,NEEDLE_RADIUS*2,NEEDLE_FRAME_THICKNESS-1); /* Clear drawing buffer */ PadRectangular(&buffer_screen,x_len,y_len,LCD_COLOR_WHITE, &rect_screen); while(1) { board_ID = PIN_ID_Read(); LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE-1); sprintf(lcd_text_main," CAN Demo ID:%d ",board_ID); LCD_DisplayStringLine(LINE(0), (uint8_t*)lcd_text_main); Demo_GyroReadAngRate (Buffer); //Delay_1us(1000); /* MEMS Filtering */ #define LP_ALPHA 0.1f GyX = GyX*(1.0f - LP_ALPHA) + (Buffer[0] - X_offset)*LP_ALPHA; GyY = GyY*(1.0f - LP_ALPHA) + (Buffer[1] - Y_offset)*LP_ALPHA; GyZ = GyZ*(1.0f - LP_ALPHA) + (Buffer[2] - Z_offset)*LP_ALPHA; if(GyX > 90.0f) GyX = 90.0f; if(GyX < -90.0f) GyX = -90.0f; if(GyY > 90.0f) GyY = 90.0f; if(GyY < -90.0f) GyY = -90.0f; if(GyZ > 90.0f) GyZ = 90.0f; if(GyZ < -90.0f) GyZ = -90.0f; /* Start drawing rectangular */ prev_rect = rect1; rect1.xlen = 25; rect1.ylen = 30; rect1.xpos = x_len/2+ (int16_t)(GyY)-10; rect1.ypos = y_len/2 + (int16_t)(GyX)-10; if(board_ID == 1){ MoveNeedle(LCD_BACKGROUND_LAYER,&buffer_screen,x_len,y_len,LCD_COLOR_GREEN,NEEDLE1_CENTER_X,NEEDLE1_CENTER_Y,-GyZ,-GyZ_prev,NEEDLE_RADIUS,NEEDLE_BASE_WIDTH); }else if(board_ID == 2){ MoveNeedle(LCD_BACKGROUND_LAYER,&buffer_screen,x_len,y_len,LCD_COLOR_GREEN,NEEDLE2_CENTER_X,NEEDLE2_CENTER_Y,-GyZ,-GyZ_prev,NEEDLE_RADIUS,NEEDLE_BASE_WIDTH); }else { MoveNeedle(LCD_BACKGROUND_LAYER,&buffer_screen,x_len,y_len,LCD_COLOR_GREEN,NEEDLE3_CENTER_X,NEEDLE3_CENTER_Y,-GyZ,-GyZ_prev,NEEDLE_RADIUS,NEEDLE_BASE_WIDTH); } CAN2_TransmitGyro(board_ID,GyZ); /* Received Data */ if( can2_rx_isr_flag ==1){ do{ if( can2_rx_isr_flag ==1){ can2RxMessage = CAN2_PassRXMessage(); can2_rx_isr_flag=0; }else{ CAN_Receive(CAN2, CAN_FIFO0, &can2RxMessage); } GPIO_ToggleBits(GPIOG,GPIO_Pin_14); ptr[0] = can2RxMessage.Data[0]; ptr[1] = can2RxMessage.Data[1]; ptr[2] = can2RxMessage.Data[2]; ptr[3] = can2RxMessage.Data[3]; if(( can2RxMessage.ExtId & 0x0000FFFF) == 1){ ptr = & receivedGyro1; ptr[0] = can2RxMessage.Data[0]; ptr[1] = can2RxMessage.Data[1]; ptr[2] = can2RxMessage.Data[2]; ptr[3] = can2RxMessage.Data[3]; MoveNeedle(LCD_BACKGROUND_LAYER,&buffer_screen,x_len,y_len,LCD_COLOR_RED,NEEDLE1_CENTER_X,NEEDLE1_CENTER_Y,-receivedGyro1,-receivedGyro1_prev,NEEDLE_RADIUS,NEEDLE_BASE_WIDTH); receivedGyro1_prev = receivedGyro1; }else if (( can2RxMessage.ExtId & 0x0000FFFF) == 2){ ptr = & receivedGyro2; ptr[0] = can2RxMessage.Data[0]; ptr[1] = can2RxMessage.Data[1]; ptr[2] = can2RxMessage.Data[2]; ptr[3] = can2RxMessage.Data[3]; MoveNeedle(LCD_BACKGROUND_LAYER,&buffer_screen,x_len,y_len,LCD_COLOR_RED,NEEDLE2_CENTER_X,NEEDLE2_CENTER_Y,-receivedGyro2,-receivedGyro2_prev,NEEDLE_RADIUS,NEEDLE_BASE_WIDTH); receivedGyro2_prev = receivedGyro2; }else if (( can2RxMessage.ExtId & 0x0000FFFF) == 3){ ptr = & receivedGyro3; ptr[0] = can2RxMessage.Data[0]; ptr[1] = can2RxMessage.Data[1]; ptr[2] = can2RxMessage.Data[2]; ptr[3] = can2RxMessage.Data[3]; MoveNeedle(LCD_BACKGROUND_LAYER,&buffer_screen,x_len,y_len,LCD_COLOR_RED,NEEDLE3_CENTER_X,NEEDLE3_CENTER_Y,-receivedGyro3,-receivedGyro3_prev,NEEDLE_RADIUS,NEEDLE_BASE_WIDTH); receivedGyro3_prev = receivedGyro3; } // LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE-1); // sprintf(lcd_text_main," ID :%d ", can2RxMessage.StdId); // LCD_DisplayStringLine(LINE(1), (uint8_t*)lcd_text_main); // LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE-1); // sprintf(lcd_text_main," Data :%f ", receivedGyro); // LCD_DisplayStringLine(LINE(2), (uint8_t*)lcd_text_main); }while(CAN_MessagePending(CAN2, CAN_FIFO0) > 0); } // { // uint8_t status=0; // while(CAN_TransmitStatus(CAN2, 0) != CAN_TxStatus_Ok ){ // status = CAN_TransmitStatus(CAN2, 0); // if(status == CAN_TxStatus_Failed){ // GPIO_ToggleBits(GPIOG,GPIO_Pin_14); // } // } // } // TxMessage.StdId = (uint32_t)board_ID; // TxMessage.RTR = CAN_RTR_DATA; // TxMessage.IDE = CAN_ID_STD; // TxMessage.DLC = 8; // TxMessage.Data[0] = 0x01; // TxMessage.Data[1] = 0x01; // TxMessage.Data[2] = 0x01; // TxMessage.Data[3] = 0x01; // TxMessage.Data[4] = 0x01; // TxMessage.Data[5] = 0x01; // TxMessage.Data[6] = 0x01; // TxMessage.Data[7] = 0x01; // CAN_Transmit(CAN2, &TxMessage); //CAN2_TransmitGyro(test_int++,test_float); test_float += 0.1f; GyX_prev = GyX; GyZ_prev = GyZ; GyY_prev = GyY; runner += 1.0f; /* Faster method */ //MoveAndUpdateRectangular(LCD_FOREGROUND_LAYER,&buffer_screen,x_len,y_len,LCD_COLOR_BLACK,&prev_rect, &rect1); /* Regular method */ // PadRectangular(&buffer_screen,x_len,y_len,LCD_COLOR_WHITE, &prev_rect); // PadRectangular(&buffer_screen,x_len,y_len,LCD_COLOR_BLACK, &rect1); //DrawBufferToScreen(LCD_FOREGROUND_LAYER,buf_ptr,0,0, x_len,y_len); } }
/* * 函数名:CAN_Polling * 描述 :配置 CAN 的工作模式为 回环模式 * 输入 :无 * 输出 : -PASSED 成功 * -FAILED 失败 * 调用 :内部调用 */ TestStatus CAN_Polling(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage; CanRxMsg RxMessage; uint32_t i = 0; uint8_t TransmitMailbox = 0; /* CAN register init */ CAN_DeInit(CAN1); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM=DISABLE; // 时间触发通信禁止 CAN_InitStructure.CAN_ABOM=DISABLE; // 离线退出是在中断置位清0后退出 CAN_InitStructure.CAN_AWUM=DISABLE; // 自动唤醒模式:清零sleep CAN_InitStructure.CAN_NART=DISABLE; // 自动重新传送豹纹,知道发送成功 CAN_InitStructure.CAN_RFLM=DISABLE; // FIFO没有锁定,新报文覆盖旧报文 CAN_InitStructure.CAN_TXFP=DISABLE; // 发送报文优先级确定:标志符 CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; // 回环模式 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; // 1tq、BS1、BS2的值跟波特率有关 CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=5; // 分频系数为5 CAN_Init(CAN1, &CAN_InitStructure); // 初始化CAN1 /* CAN filter init */ 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=0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* transmit */ TxMessage.StdId=0x11; // 设定标准标识符(11位,扩展的为29位) TxMessage.RTR=CAN_RTR_DATA; // 传输消息的帧类型为数据帧(还有远程帧) TxMessage.IDE=CAN_ID_STD; // 消息标志符实验标准标识符 TxMessage.DLC=2; // 发送两帧,一帧8位 TxMessage.Data[0]=0xCA; // 第一帧数据 TxMessage.Data[1]=0xFE; // 第二帧数据 TransmitMailbox=CAN_Transmit(CAN1, &TxMessage); i = 0; // 用于检查消息传输是否正常 while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF)) { i++; } i = 0; // 检查返回的挂号的信息数目 while((CAN_MessagePending(CAN1, CAN_FIFO0) < 1) && (i != 0xFF)) { i++; } /* receive */ RxMessage.StdId=0x00; RxMessage.IDE=CAN_ID_STD; RxMessage.DLC=0; RxMessage.Data[0]=0x00; RxMessage.Data[1]=0x00; CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); if (RxMessage.StdId!=0x11) { return FAILED; } if (RxMessage.IDE!=CAN_ID_STD) { return FAILED; } if (RxMessage.DLC!=2) { return FAILED; } /* 判断发送的信息和接收的信息是否相等 */ if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE) { return FAILED; } //printf("receive data:0X%X,0X%X",RxMessage.Data[0], RxMessage.Data[1]); return PASSED; /* Test Passed */ }
//受信 int main(void) { char str[150] = {0}; init(); GPIOD->BSRRL = GPIO_Pin_12; sprintf(str,"Start CAN!\n\r"); transmit_uart3_s(str); while(1) { #ifndef USE_INTERRUPT_CAN_RX GPIOD->BSRRL = GPIO_Pin_13; GPIOD->BSRRH = GPIO_Pin_14; while(0 == CAN_MessagePending(CAN1, CAN_FIFO0)); CAN_Receive(CAN1, CAN_FIFO0, &can_rx_flame);//受信 GPIOD->BSRRL = GPIO_Pin_14; GPIOD->BSRRH = GPIO_Pin_13; #else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == SET){ GPIOD->BSRRH = GPIO_Pin_13; }else{ GPIOD->BSRRL = GPIO_Pin_13; } #endif while(ticker > 300){ ticker = 0; sprintf(str,"StId:0x%X \n\rIDE:0x%X \n\rRTR:%d \n\rDLC:%X \n\rData[0]:0x%X \n\rData[1]:0x%X \n\rData[2]:0x%X \n\rData[3]:0x%X \n\rData[4]:0x%X \n\rData[5]:0x%X \n\rData[6]:0x%X \n\rData[7]:0x%X \n\rFMI:%d \n\rRerror:%d \n\rTerror:%d\n\r\n" ,can_rx_flame.StdId ,can_rx_flame.IDE ,can_rx_flame.RTR ,can_rx_flame.DLC ,can_rx_flame.Data[0] ,can_rx_flame.Data[1] ,can_rx_flame.Data[2] ,can_rx_flame.Data[3] ,can_rx_flame.Data[4] ,can_rx_flame.Data[5] ,can_rx_flame.Data[6] ,can_rx_flame.Data[7] ,can_rx_flame.FMI ,CAN_GetReceiveErrorCounter(CAN1) ,CAN_GetLSBTransmitErrorCounter(CAN1)); /* sprintf(str," start:%X\n\r select:%X\n\r left_x:%X\n\r left_y:%X\n\r right_x:%X\n\r right_y:%X\n\r L1:%X\n\r L2:%X\n\r R1:%X\n\r R2:%X\n\r Tri:%X\n\r Cir:%X\n\r Cro:%X\n\r Squ:%X\n\r Up:%X\n\r Right:%X\n\r Dow:%X\n\r left:%X\n\r CAN_C:%d\n\r" ,psbutton.start.value ,psbutton.select.value ,psbutton.left_x.value ,psbutton.left_y.value ,psbutton.right_x.value ,psbutton.right_y.value ,psbutton.L1.value ,psbutton.L2.value ,psbutton.R1.value ,psbutton.R2.value ,psbutton.Triangle.value ,psbutton.Circle.value ,psbutton.Cross.value ,psbutton.Square.value ,psbutton.Up.value ,psbutton.Down.value ,psbutton.Right.value ,psbutton.Left.value ,can_tx_count); */ transmit_uart3_s(str); //VCP_send_str(str); } } }
/** * @brief Configures the CAN, transmit and receive by polling * @param None * @retval PASSED if the reception is well done, FAILED in other case */ TestStatus CAN_Polling(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage; CanRxMsg RxMessage; uint32_t i = 0; uint8_t TransmitMailbox = 0; /* CAN register init */ CAN_DeInit(CAN); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ 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_LoopBack; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; /* CAN Baudrate = 125kbps (CAN clocked at 36 MHz) */ CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 16; CAN_Init(CAN, &CAN_InitStructure); /* CAN filter init */ 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 = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* transmit */ TxMessage.StdId = 0x11; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 2; TxMessage.Data[0] = 0xCA; TxMessage.Data[1] = 0xFE; TransmitMailbox = CAN_Transmit(CAN, &TxMessage); i = 0; while((CAN_TransmitStatus(CAN, TransmitMailbox) != CANTXOK) && (i != 0xFFFF)) { i++; } i = 0; while((CAN_MessagePending(CAN, CAN_FIFO0) < 1) && (i != 0xFFFF)) { i++; } /* receive */ RxMessage.StdId = 0x00; RxMessage.IDE = CAN_ID_STD; RxMessage.DLC = 0; RxMessage.Data[0] = 0x00; RxMessage.Data[1] = 0x00; CAN_Receive(CAN, CAN_FIFO0, &RxMessage); if (RxMessage.StdId != 0x11) { return FAILED; } if (RxMessage.IDE != CAN_ID_STD) { return FAILED; } if (RxMessage.DLC != 2) { return FAILED; } if ((RxMessage.Data[0]<<8|RxMessage.Data[1]) != 0xCAFE) { return FAILED; } return PASSED; /* Test Passed */ }
/******************************************************************************* * Function Name : PollCAN * Description : periodièno procesiranje CAN protokola v glavni zanki * Input : * Output : * Return : FLASH_COMPLETE na bootloader strani, FLASH_STATUS na strani * klienta (glej stm32f10x_flash.h) *******************************************************************************/ int PollCAN(CanRxMsg *p) { static int addr,n=0; // statièni register za zaèetno. adreso, index IAP stringa int i; // .... CanRxMsg Rx; if(!p) { if(!CAN_MessagePending(CAN1, CAN_FIFO0)) return(EOF); p=&Rx; CAN_Receive(CAN1,CAN_FIFO0, p); } switch(p->StdId) { //---------------------------------------------------------------------------------------------- // client - deep sleep (watchdog), no ack. case _ID_IAP_GO: NVIC_SystemReset(); break; //---------------------------------------------------------------------------------------------- // client - sign FW case _ID_IAP_SIGN: SendAck(crcSIGN()); break; //---------------------------------------------------------------------------------------------- // client - setup adrese, no ack case _ID_IAP_ADDRESS: addr=*(int *)p->Data; break; //---------------------------------------------------------------------------------------------- // client - programiranje 2x4 bytov, ack case _ID_IAP_DWORD: for(i=p->DLC; i<8; ++i) p->Data[i]=((char *)addr)[i]; i=FlashProgram32(addr,*(int *)(&p->Data[0])); addr+=4; ++_Words32Received; if(p->DLC>4) { i |= FlashProgram32(addr,*(int *)(&p->Data[4])); } addr+=4; ++_Words32Received; SendAck(i); break; //---------------------------------------------------------------------------------------------- // client - brisanje, ack case _ID_IAP_ERASE: _Words32Received=0; Watchdog(); SendAck(EraseFLASH(*(int *)p->Data)); break; //---------------------------------------------------------------------------------------------- // client - brisanje, ack case _ID_IAP_STRING: for(i=0; i<p->DLC && n<_IAP_STRING_LEN; ++i, ++n) _Iap_string[n]=p->Data[i]; if(_Iap_string[n-1]=='\0' || _Iap_string[n-1]=='\r' || _Iap_string[n-1]=='\n' || n==_IAP_STRING_LEN) { n=0; CanHexProg(NULL); } break; //---------------------------------------------------------------------------------------------- // client - brisanje, ack case _ID_IAP_PING: SendAck(0); break; //---------------------------------------------------------------------------------------------- // server - acknowledge received case _ID_IAP_ACK: return(p->Data[0]); //---------------------------------------------------------------------------------------------- default: break; } return(EOF); }
TestStatus CAN_Polling(void) { CanTxMsg TxMessage; CanRxMsg RxMessage; uint32_t i = 0; uint8_t TransmitMailbox = 0; /* transmit */ TxMessage.StdId=0x11; // 设定标准标识符(11位,扩展的为29位) TxMessage.RTR=CAN_RTR_DATA; // 传输消息的帧类型为数据帧(还有远程帧) TxMessage.IDE=CAN_ID_STD; // 消息标志符实验标准标识符 TxMessage.DLC=2; // 发送两帧,一帧8位 TxMessage.Data[0]=0xCA; // 第一帧数据 TxMessage.Data[1]=0xFE; // 第二帧数据 TransmitMailbox=CAN_Transmit(CAN1, &TxMessage); i = 0; // 用于检查消息传输是否正常 while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF)) { i++; } i = 0; // 检查返回的挂号的信息数目 while((CAN_MessagePending(CAN1, CAN_FIFO0) < 1) && (i != 0xFF)) { i++; } /* receive */ RxMessage.StdId=0x00; RxMessage.IDE=CAN_ID_STD; RxMessage.DLC=0; RxMessage.Data[0]=0x00; RxMessage.Data[1]=0x00; CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); if (RxMessage.StdId!=0x11) { return FAILED; } if (RxMessage.IDE!=CAN_ID_STD) { return FAILED; } if (RxMessage.DLC!=2) { return FAILED; } /* 判断发送的信息和接收的信息是否相等 */ if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE) { return FAILED; } //printf("receive data:0X%X,0X%X",RxMessage.Data[0], RxMessage.Data[1]); return PASSED; /* Test Passed */ }