【BL606P-DVK开发板】CAN扩展模块收发测试
[复制链接]
本帖最后由 TL-LED 于 2023-2-19 18:21 编辑
本计划是使用这款开发板来播放CAN通信控制的语音播放功能的,对语音这块还不是很会用,下面测试下扩展CAN通信模块收发测试功能。
一、硬件部分
1.1、使用到了硬件上的LCD接口
1.2、外扩CAN模块部分
1.3、硬件连接图
二、程序部分
2.1、端口初始化部分
gpio_dev_t gpio_2515_so = { GPIO_PIN_24, INPUT_PULL_UP, NULL }; //PIO24/LCD-PWM
gpio_dev_t gpio_2515_si = { GPIO_PIN_26, OUTPUT_PUSH_PULL, NULL }; //PIO26/LCD-DIO
gpio_dev_t gpio_2515_sck= { GPIO_PIN_27, OUTPUT_PUSH_PULL, NULL }; //PIO27/LCD-CLK
gpio_dev_t gpio_2515_cs = { GPIO_PIN_28, OUTPUT_PUSH_PULL, NULL }; //PIO28/LCD-CS
gpio_dev_t gpio_2515_int = { GPIO_PIN_25, IRQ_MODE, NULL }; //PIO25
#define mcp2515_clk_l() hal_gpio_output_low(&gpio_2515_sck)
#define mcp2515_clk_h() hal_gpio_output_high(&gpio_2515_sck)
#define mcp2515_si_l() hal_gpio_output_low(&gpio_2515_si )
#define mcp2515_si_h() hal_gpio_output_high(&gpio_2515_si )
#define mcp2515_cs_l() hal_gpio_output_low(&gpio_2515_cs )
#define mcp2515_cs_h() hal_gpio_output_high(&gpio_2515_cs )
csi_pin_set_mux( GPIO_PIN_24, PIN_FUNC_GPIO);
csi_pin_set_mux( GPIO_PIN_25, PIN_FUNC_GPIO);
csi_pin_set_mux( GPIO_PIN_26, PIN_FUNC_GPIO);
csi_pin_set_mux( GPIO_PIN_27, PIN_FUNC_GPIO);
csi_pin_set_mux( GPIO_PIN_28, PIN_FUNC_GPIO);
hal_gpio_init(&gpio_2515_so);
hal_gpio_init(&gpio_2515_si);
hal_gpio_init(&gpio_2515_sck);
hal_gpio_init(&gpio_2515_cs);
hal_gpio_init(&gpio_2515_int);
hal_gpio_output_low(&gpio_2515_si);
hal_gpio_output_low(&gpio_2515_sck);
hal_gpio_output_low(&gpio_2515_cs);
hal_gpio_enable_irq(&gpio_2515_int, IRQ_TRIGGER_FALLING_EDGE, can_eint, NULL);
2.2、main.c
#include <aos/aos.h>
#include <stdio.h>
#include <sys_clk.h>
#include "app_main.h"
#include <drv/gpio.h>
#include "led.h"
#include "tm1638.h"
#include "mcp2515.h"
int main(int argc, char *argv[])
{
int i=0;
uint8_t dispbuf[8];
uint32_t cnt=0;
uint8_t cantx_buf[8];
board_yoc_init();
init_led();
init_tm1638();
init_mcp2515();
printf("\r\napp start core clock %d........\r\n", soc_get_cur_cpu_freq());
disp_log();
aos_msleep(2000);
//codec_output_init();
//codec_input_init();
//codec_loop_init();
for(i=0;i<8;i++)
{
dispbuf[i]=0;
}
while(1)
{
cantx_buf[0]=i;
cantx_buf[1]=i+1;
cantx_buf[2]=i+2;
cantx_buf[3]=i+3;
cantx_buf[4]=i;
cantx_buf[5]=i+1;
cantx_buf[6]=i+2;
cantx_buf[7]=i+3;
CAN_Send(cantx_buf);
printf("can tx data : %02x %02x %02x %02x %02x %02x %02x %02x\r\n",cantx_buf[0],cantx_buf[1],cantx_buf[2],cantx_buf[3],cantx_buf[4],cantx_buf[5],cantx_buf[6],cantx_buf[7]);
i++;
if(i>250)
{
i=0;
}
set_ledr();
clr_ledg();
clr_ledb();
aos_msleep(100);
clr_ledr();
set_ledg();
clr_ledb();
aos_msleep(100);
clr_ledr();
clr_ledg();
set_ledb();
aos_msleep(100);
clr_ledr();
clr_ledg();
clr_ledb();
aos_msleep(100);
if(cnt>999)
{
cnt=0;
}
cnt++;
dispbuf[4]=cnt/1000;
dispbuf[5]=(cnt%1000)/100;
dispbuf[6]=((cnt%1000)%100)/10;
dispbuf[7]=((cnt%1000)%100)%10;
disp_led(dispbuf);
}
return 0;
}
2.3、can接收部分程序
void can_eint(void *args)
{
uint8_t rx_sta;
rx_sta=CAN_ReadINTF();
if(rx_sta&0x01)
{
CAN_SetINTF(0x00);
CAN_RecRXB0(canrx_buf);
printf("can rx data : %02x %02x %02x %02x %02x %02x %02x %02x\r\n",canrx_buf[0],canrx_buf[1],canrx_buf[2],canrx_buf[3],canrx_buf[4],canrx_buf[5],canrx_buf[6],canrx_buf[7]);
}
}
三、运行结果
CAN软件和串口收发数据显示
|