wordpress 留言板 插件seo排名查詢
雙CAN開發(fā)板
- 雙CAN、一路485開發(fā)板的設(shè)計(jì)
- 開發(fā)板配置
- 器件選型
- CAN設(shè)計(jì)
- 硬件設(shè)計(jì)
- 軟件設(shè)計(jì)
- 485設(shè)計(jì)
- 硬件設(shè)計(jì)
- 軟件設(shè)計(jì)
- 其他設(shè)計(jì)
- LED硬件
- 按鍵硬件
- PCB板子和實(shí)物圖
- 開發(fā)板測(cè)試視頻
- 其他資料
雙CAN、一路485開發(fā)板的設(shè)計(jì)
最近工作經(jīng)常會(huì)出現(xiàn)一些小問題。就想設(shè)計(jì)一款帶CAN的開發(fā)板用來測(cè)試代碼,于是就設(shè)計(jì)了一款雙CAN帶一路485的開發(fā)板。 此篇文章是關(guān)于開發(fā)板的設(shè)計(jì)方案。
開發(fā)板配置
- 雙路CAN通信
- 一路485通信(兩路串口可選)
- 一個(gè)EEPROM存儲(chǔ)
- 三個(gè)LED指示燈
- 三個(gè)按鍵
- 其余所有IO口引出
器件選型
主控采用了國(guó)產(chǎn)兆易的GD互聯(lián)型芯片,有兩路CAN通信,CAN采用目前比較流程TJA1057方案。以下是主要的器件選型:
- 主控MCU :GD32F105RBT6;
- CAN芯片:TJA1057T;
- 485芯片:MAX3485ESA;
- EEPROM芯片:AT24C128;
- 電源芯片芯片:ASM1117-3.3V;
CAN設(shè)計(jì)
硬件設(shè)計(jì)
CAN設(shè)計(jì)采用TJA1057T設(shè)計(jì),由于TJA1057T是5V芯片,需要在Rx到單片機(jī)采用一個(gè)電壓轉(zhuǎn)換電路。為了節(jié)省成本,我們采用一個(gè)分壓電阻,將電壓調(diào)試到3.3V。設(shè)計(jì)還并聯(lián)了一個(gè)120歐的匹配電阻,和一個(gè)跳線帽串聯(lián)起來,用戶可以通過跳線帽先擇是否接入120電阻。這題設(shè)計(jì)如圖所示。
軟件設(shè)計(jì)
CAN波特率計(jì)算:波特率 = APB1頻率 / CAN分頻 / (BS1 + BS2 +1);
這里初始化采用的是掩碼模式,掩碼中設(shè)置的為1時(shí),報(bào)文ID為必須匹配,掩碼為0時(shí)報(bào)文ID為無關(guān)緊要。例如ID為:0x18FF1111。當(dāng)掩碼設(shè)置為0x1FFF FFFF時(shí)。只有接收到0x18FF1111才會(huì)通過濾波進(jìn)入CAN接收中斷。當(dāng)掩碼設(shè)置為0x1FFFFFFE時(shí),可以接收到0x18FF1110和0x18FF1111。
void SysInit_CAN(void)
{/* CANs configuration */CAN_Config();/* IT Configuration for CAN1 */can_interrupt_enable(CAN0, ENABLE);can_interrupt_enable(CAN1, ENABLE);
}
/*CAN初始化*/
void CAN_Config(void)
{uint32_t id ;can_parameter_struct CAN_InitStructure;can_filter_parameter_struct CAN_FilterInitStructure;rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_CAN0);rcu_periph_clock_enable(RCU_CAN1);rcu_periph_clock_enable(RCU_AF);/* Configure CAN1 RX pin */gpio_pin_remap_config(GPIO_CAN0_PARTIAL_REMAP, ENABLE);gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_8);gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_10MHZ, GPIO_PIN_12);gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_13);/* Configure CAN1 TX pin *//* CAN1 and CAN2 register init */can_deinit(CAN0);can_deinit(CAN1);/* initialize CAN */CAN_InitStructure.time_triggered = DISABLE;CAN_InitStructure.auto_bus_off_recovery = ENABLE;CAN_InitStructure.auto_wake_up = DISABLE;CAN_InitStructure.auto_retrans = DISABLE;CAN_InitStructure.rec_fifo_overwrite = DISABLE;CAN_InitStructure.trans_fifo_order = DISABLE;CAN_InitStructure.working_mode = CAN_NORMAL_MODE;CAN_InitStructure.resync_jump_width = CAN_BT_SJW_1TQ;CAN_InitStructure.time_segment_1 = CAN_BT_BS1_6TQ;CAN_InitStructure.time_segment_2 = CAN_BT_BS2_1TQ;/* baudrate 250K bps */CAN_InitStructure.prescaler = 6;can_init(CAN0, &CAN_InitStructure);CAN_InitStructure.prescaler = 6;can_init(CAN1, &CAN_InitStructure);/* initialize filter */id = 0x18ffffff;//需過濾的EXT_ID/* CAN0 filter number */CAN_FilterInitStructure.filter_number = 0;/* initialize filter */CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_MASK;CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_32BIT;CAN_FilterInitStructure.filter_list_high = (((u32)id <<3)&0xFFFF0000)>>16;;CAN_FilterInitStructure.filter_list_low = (((u32)id <<3)|CAN_FF_STANDARD|CAN_FF_EXTENDED)&0xFFFF;;CAN_FilterInitStructure.filter_mask_high = 0x0000;CAN_FilterInitStructure.filter_mask_low = 0x0000;CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;CAN_FilterInitStructure.filter_enable = ENABLE;can_filter_init(&CAN_FilterInitStructure);/* initialize filter */id = 0x18ffffff;//需過濾的EXT_ID/* CAN0 filter number */CAN_FilterInitStructure.filter_number = 15;/* initialize filter */CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_MASK;CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_32BIT;CAN_FilterInitStructure.filter_list_high = (((u32)id <<3)&0xFFFF0000)>>16;;CAN_FilterInitStructure.filter_list_low = (((u32)id <<3)|CAN_FF_STANDARD|CAN_FF_EXTENDED)&0xFFFF;;CAN_FilterInitStructure.filter_mask_high = 0x0000;CAN_FilterInitStructure.filter_mask_low = 0x0000;CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;CAN_FilterInitStructure.filter_enable = ENABLE;can_filter_init(&CAN_FilterInitStructure);can_interrupt_enable(CAN0, CAN_INT_RFNE0);can_interrupt_enable(CAN1, CAN_INT_RFNE0);
}
/*CAN0接收中斷*/
void CAN0_RX0_IRQHandler(void)
{Init_RxMes(&RxMessage);can_message_receive(CAN0, CAN_FIFO0, &RxMessage);CAN0_RXData();
}
/*CAN1接收中斷*/
void CAN1_RX0_IRQHandler(void)
{Init_RxMes(&RxMessage);can_message_receive(CAN1, CAN_FIFO0, &RxMessage);CAN1_RXData();
}
485設(shè)計(jì)
485硬件設(shè)計(jì)采用了自動(dòng)收發(fā)報(bào)文的設(shè)計(jì)。具體實(shí)現(xiàn)方案可以自行百度搜索。
硬件設(shè)計(jì)
軟件設(shè)計(jì)
軟件就是一般的串口初始化。
/*IO口初始化*/
void usart_init(void)
{rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_AF);rcu_periph_clock_enable(RCU_USART0);gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);usart_deinit(USART0);usart_baudrate_set(USART0, 9600);usart_word_length_set(USART0, USART_WL_8BIT);usart_stop_bit_set(USART0, USART_STB_1BIT);usart_parity_config(USART0, USART_PM_NONE);usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);usart_receive_config(USART0, USART_RECEIVE_ENABLE);usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);usart_enable(USART0);usart_interrupt_enable(USART0, USART_INT_RBNE);nvic_irq_enable(USART0_IRQn,1,2);
}/* retarget the C library printf function to the usart */
int fputc(int ch, FILE *f)
{usart_data_transmit(USART0, (uint8_t) ch);while (RESET == usart_flag_get(USART0, USART_FLAG_TBE));return ch;
}
/*串口0接收中斷*/
void USART0_IRQHandler(void)
{uint16_t data;if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){/* receive data */data = usart_data_receive(USART0);usart_data_receive(USART0);}
}
其他設(shè)計(jì)
LED硬件
硬件LED采用的是共陰極,IO口驅(qū)動(dòng)的話輸出高電平LED點(diǎn)亮。
按鍵硬件
硬件按鍵采用的是監(jiān)測(cè)地。配置IO口時(shí)要配置為上拉輸入。當(dāng)IO口監(jiān)測(cè)到低電平時(shí)表示按鍵按下。
PCB板子和實(shí)物圖
開發(fā)板測(cè)試視頻
板子焊接好后,按照如圖所示插上相應(yīng)的跳線帽,通過5VType-C口給模塊供電。測(cè)試代碼固件燒錄進(jìn)去之后,三個(gè)LED點(diǎn)亮,其中一個(gè)LED0.5HZ頻率閃爍。按下按鍵后,相應(yīng)的LED燈切換狀態(tài)。串口波特率為9600,并且每1秒輸出
Shiboven PCB-018 測(cè)試固件 V1.0 CAN測(cè)試請(qǐng)使用5VUSB供電。兩路CAN波特率都為250k
。兩路CAN都是250K波特率并每1秒輸出一路為:ID0x12345678,另一路為0x17654321。
注意:CANH、CANL別接反了。485A、485B也別接反了!!!
雙CAN+一路485演示視頻演示視頻
其他資料
資料包中有硬件軟件源碼及其他資料。包括一堆CAN資料包。