第一次提交
This commit is contained in:
315
Bsp/bsp_can.c
Normal file
315
Bsp/bsp_can.c
Normal file
@@ -0,0 +1,315 @@
|
||||
#include "bsp_can.h"
|
||||
#include <stdio.h>
|
||||
#include "systick.h"
|
||||
|
||||
can_rx_message_type can1_receive_message_fifo0;
|
||||
can_tx_message_type can1_transmit_message;
|
||||
volatile Enum_can_mode can1_receive_fifo0_flag;
|
||||
|
||||
uint8_t bit12[8];
|
||||
uint8_t bit13[8];
|
||||
uint8_t bit14[8];
|
||||
uint8_t bit15[8];
|
||||
uint8_t bit16[8];
|
||||
uint8_t bit17[8];
|
||||
uint8_t bit18[8];
|
||||
uint8_t bit19[8];
|
||||
uint8_t bit20[8];
|
||||
|
||||
void TJA1042_STB_Config(void) {
|
||||
gpio_init_type gpio_init_struct;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD> GPIOA ʱ<><CAB1> */
|
||||
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
|
||||
|
||||
|
||||
gpio_default_para_init(&gpio_init_struct);
|
||||
gpio_init_struct.gpio_pins = GPIO_PINS_12; // ѡ<><D1A1> PA0
|
||||
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT; // <20><><EFBFBD><EFBFBD>ģʽ
|
||||
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
gpio_init_struct.gpio_pull = GPIO_PULL_NONE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
gpio_init(GPIOB, &gpio_init_struct);
|
||||
gpio_bits_reset(GPIOB, GPIO_PINS_12);
|
||||
}
|
||||
|
||||
static void can1_gpio_config(void)
|
||||
{
|
||||
gpio_init_type gpio_init_struct;
|
||||
/* enable the gpio clock */
|
||||
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
|
||||
|
||||
gpio_default_para_init(&gpio_init_struct);
|
||||
|
||||
/* configure the can tx, rx pin */
|
||||
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
|
||||
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
|
||||
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
|
||||
gpio_init_struct.gpio_pins = GPIO_PINS_11 | GPIO_PINS_12;
|
||||
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
|
||||
gpio_init(GPIOA, &gpio_init_struct);
|
||||
|
||||
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE12, GPIO_MUX_9);
|
||||
gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_9);
|
||||
TJA1042_STB_Config();
|
||||
delay_ms(100);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief can configiguration.
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
static void can1_configuration(void)
|
||||
{
|
||||
can_base_type can_base_struct;
|
||||
can_baudrate_type can_baudrate_struct;
|
||||
can_filter_init_type can_filter_init_struct;
|
||||
/* enable the can clock */
|
||||
crm_periph_clock_enable(CRM_CAN1_PERIPH_CLOCK, TRUE);
|
||||
|
||||
/* can base init */
|
||||
can_default_para_init(&can_base_struct);
|
||||
can_base_struct.mode_selection = CAN_MODE_COMMUNICATE;
|
||||
can_base_struct.ttc_enable = FALSE;
|
||||
can_base_struct.aebo_enable = FALSE;
|
||||
can_base_struct.aed_enable = FALSE;
|
||||
can_base_struct.prsf_enable = FALSE;
|
||||
can_base_struct.mdrsel_selection = CAN_DISCARDING_FIRST_RECEIVED;
|
||||
can_base_struct.mmssr_selection = CAN_SENDING_BY_REQUEST;
|
||||
|
||||
can_base_init(CAN1, &can_base_struct);
|
||||
|
||||
/* can baudrate, set boudrate = pclk/(baudrate_div *(1 + bts1_size + bts2_size)) */
|
||||
can_baudrate_struct.baudrate_div = 30;
|
||||
can_baudrate_struct.rsaw_size = CAN_RSAW_1TQ;
|
||||
can_baudrate_struct.bts1_size = CAN_BTS1_6TQ;
|
||||
can_baudrate_struct.bts2_size = CAN_BTS2_1TQ;
|
||||
can_baudrate_set(CAN1, &can_baudrate_struct);
|
||||
|
||||
|
||||
/*can_filter_0_config--------------------------------------------------------------*/
|
||||
can_filter_init_struct.filter_activate_enable = TRUE;
|
||||
can_filter_init_struct.filter_number = 0;
|
||||
can_filter_init_struct.filter_fifo = CAN_FILTER_FIFO0;
|
||||
can_filter_init_struct.filter_bit = CAN_FILTER_16BIT;
|
||||
can_filter_init_struct.filter_mode = CAN_FILTER_MODE_ID_MASK;
|
||||
/*Standard identifier + Mask Mode + Data/Remote frame: id/mask 11bit --------------*/
|
||||
can_filter_init_struct.filter_id_high = 0x0000;
|
||||
can_filter_init_struct.filter_id_low = 0x0000;
|
||||
can_filter_init_struct.filter_mask_high = 0x0000;
|
||||
can_filter_init_struct.filter_mask_low = 0x0000;
|
||||
|
||||
can_filter_init(CAN1, &can_filter_init_struct);
|
||||
|
||||
/* can interrupt config */
|
||||
//nvic_irq_enable(CAN1_SE_IRQn, 0x00, 0x00);
|
||||
nvic_irq_enable(CAN1_RX0_IRQn, 2, 0);
|
||||
can_interrupt_enable(CAN1, CAN_RF0MIEN_INT, TRUE);
|
||||
|
||||
// /* error interrupt enable */
|
||||
// can_interrupt_enable(CAN1, CAN_ETRIEN_INT, TRUE);
|
||||
// can_interrupt_enable(CAN1, CAN_EOIEN_INT, TRUE);
|
||||
}
|
||||
|
||||
void can1_init(void)
|
||||
{
|
||||
can1_gpio_config();
|
||||
can1_configuration();
|
||||
delay_ms(200);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void send_can1_data(uint32_t id, uint8_t *msg, uint8_t msg_len)
|
||||
{
|
||||
// over_time = 600;
|
||||
uint16_t over_time = 600;
|
||||
if(msg_len > 8)
|
||||
{
|
||||
msg_len = 8;
|
||||
}
|
||||
|
||||
can1_transmit_message.standard_id = id;
|
||||
can1_transmit_message.extended_id = 0;
|
||||
can1_transmit_message.id_type = CAN_ID_STANDARD;
|
||||
can1_transmit_message.frame_type = CAN_TFT_DATA;
|
||||
can1_transmit_message.dlc = msg_len;
|
||||
|
||||
for(uint8_t i = 0; i < msg_len; i++)
|
||||
can1_transmit_message.data[i] = msg[i];
|
||||
|
||||
|
||||
/* transmit message */
|
||||
while((can_message_transmit(CAN1, &can1_transmit_message) == CAN_TX_STATUS_NO_EMPTY) && (over_time))
|
||||
{
|
||||
over_time--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void send_can1_buffer(uint32_t id, uint8_t *buffer, uint16_t buffer_len)
|
||||
{
|
||||
uint8_t temp1 = buffer_len/8;
|
||||
uint8_t temp2 = buffer_len%8;
|
||||
|
||||
|
||||
if(temp1 == 0)
|
||||
{
|
||||
send_can1_data(id, buffer, buffer_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(uint8_t i = 0; i < temp1; i++)
|
||||
{
|
||||
send_can1_data(id, buffer + 8*i, 8);
|
||||
}
|
||||
if(temp2 != 0)
|
||||
{
|
||||
send_can1_data(id, buffer+(buffer_len - temp2), temp2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CAN1_RX0_IRQHandler(void)
|
||||
{
|
||||
if (can_flag_get(CAN1, CAN_RF0MN_FLAG) == SET)
|
||||
{
|
||||
can_flag_clear(CAN1, CAN_RF0MN_FLAG);
|
||||
can_message_receive(CAN1, CAN_RX_FIFO0, &can1_receive_message_fifo0);
|
||||
|
||||
// ֱ<><D6B1>ʹ<EFBFBD><CAB9> can1_receive_message_fifo0
|
||||
// switch(can1_receive_message_fifo0.standard_id)
|
||||
// {
|
||||
// case 0x014:
|
||||
// // <20><><EFBFBD><EFBFBD>ID 0x020
|
||||
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit20);
|
||||
// break;
|
||||
// case 0x013:
|
||||
// // <20><><EFBFBD><EFBFBD>ID 0x002
|
||||
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit19);
|
||||
// break;
|
||||
// case 0x012:
|
||||
// // <20><><EFBFBD><EFBFBD>ID 0x003
|
||||
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit18);
|
||||
// break;
|
||||
// case 0x11:
|
||||
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit17);
|
||||
// break;
|
||||
// case 0x10:
|
||||
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit16);
|
||||
// break;
|
||||
// case 0x00F:
|
||||
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit15);
|
||||
// break;
|
||||
// case 0x00E:
|
||||
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit14);
|
||||
// break;
|
||||
// case 0x00D:
|
||||
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit13);
|
||||
// break;
|
||||
// case 0x00C:
|
||||
// can1_transmit_data_pressure(can1_receive_message_fifo0.standard_id,bit12);
|
||||
// break;
|
||||
// }
|
||||
}
|
||||
}
|
||||
void can_transmit_all_id(){
|
||||
|
||||
|
||||
can1_transmit_data_pressure(0x014,bit20);
|
||||
|
||||
|
||||
can1_transmit_data_pressure(0x013,bit19);
|
||||
|
||||
|
||||
can1_transmit_data_pressure(0x012,bit18);
|
||||
|
||||
|
||||
can1_transmit_data_pressure(0x011,bit17);
|
||||
|
||||
|
||||
can1_transmit_data_pressure(0x010,bit16);
|
||||
|
||||
|
||||
can1_transmit_data_pressure(0x00F,bit15);
|
||||
|
||||
|
||||
can1_transmit_data_pressure(0x00E,bit14);
|
||||
|
||||
|
||||
can1_transmit_data_pressure(0x00D,bit13);
|
||||
|
||||
|
||||
can1_transmit_data_pressure(0x00C,bit12);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
/* can transmit data */
|
||||
|
||||
void can1_transmit_data_pressure(uint32_t id,uint8_t pressure[8])
|
||||
{
|
||||
uint16_t over_time = 600;
|
||||
uint8_t transmit_status;
|
||||
can_tx_message_type tx_message_struct;
|
||||
tx_message_struct.standard_id = id;
|
||||
tx_message_struct.extended_id = 0;
|
||||
tx_message_struct.id_type = CAN_ID_STANDARD;
|
||||
tx_message_struct.frame_type = CAN_TFT_DATA;
|
||||
tx_message_struct.dlc = 8;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for(int i = 0; i < 8; i++) {
|
||||
tx_message_struct.data[i] = pressure[i];
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
transmit_status = can_message_transmit(CAN1, &tx_message_struct);
|
||||
|
||||
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD><C9BB><EFBFBD>ʱ
|
||||
while((transmit_status == CAN_TX_STATUS_NO_EMPTY) && (over_time > 0))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>С<EFBFBD>ӳ٣<D3B3><D9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||||
delay_us(10); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD>¼<EFBFBD><C2BC>鷢<EFBFBD><E9B7A2>״̬
|
||||
transmit_status = can_message_transmit(CAN1, &tx_message_struct);
|
||||
over_time--;
|
||||
}
|
||||
|
||||
}
|
||||
void copyToBytes(uint8_t externalArray[12][12]) {
|
||||
for(int i=0;i<8;i++){
|
||||
bit20[i]=externalArray[7][i];
|
||||
}
|
||||
for(int i=0;i<7;i++){
|
||||
bit12[i]=externalArray[6-i][0];
|
||||
}
|
||||
for(int i=0;i<7;i++){
|
||||
bit13[i]=externalArray[6-i][7];
|
||||
}
|
||||
for(int i=0;i<4;i++){
|
||||
bit14[i]=externalArray[6][2+i];
|
||||
bit14[4 + i]=externalArray[5][2+i];
|
||||
}
|
||||
for(int i=0;i<2;i++){
|
||||
bit15[i] = externalArray[6-i][1];
|
||||
bit15[2+i] = externalArray[6-i][6];
|
||||
}
|
||||
for(int i=0;i<4;i++){
|
||||
bit15[4+i] = externalArray[4][2+i];
|
||||
}
|
||||
bit16[0] = externalArray[4][1];
|
||||
bit16[1] = externalArray[4][6];
|
||||
for(int i=0;i<6;i++){
|
||||
bit16[2+i] = externalArray[3][i+1];
|
||||
}
|
||||
for(int i =0;i<6;i++){
|
||||
bit17[i] = externalArray[2][i+1];
|
||||
bit18[i] = externalArray[1][i+1];
|
||||
bit19[i] = externalArray[0][i+1];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user