#include "MCP2515.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <rtthread.h>
#include "systick.h"
extern can_trasnmit_message_struct TxMessage;
//MCP2515波特率预分频
#define CAN_10Kbps 0x31
#define CAN_25Kbps 0x13
#define CAN_50Kbps 0x09
#define CAN_100Kbps 0x04
#define CAN_125Kbps 0x03
#define CAN_250Kbps 0x01
#define CAN_500Kbps 0x00
#define CAN_Kbps 0x07
Can_Msg can_tx_msg;
Can_Msg can_rx_msg;
uint32_t can_rx_ID=0x00;
rt_uint8_t can_tx_flag=0;
void Delay_Nms(unsigned int x)
{
unsigned int y;
// rt_thread_mdelay(x);
rt_thread_delay(x);
// for (;x>0;x--)
// for (y=0;y<100;y++);
}
unsigned char check(void)
{
unsigned char val;
val=MCP2515_ReadByte(CANSTAT);
return val;
}
/**
* @brief SPI的 I/O配置
* @param 无
* @retval 无
*/
void SPI_MCP2515_Init(void)
{
#if 1
spi_parameter_struct spi_init_struct;
rcu_periph_clock_enable(RCU_SYSCFG);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOD);
rcu_periph_clock_enable(RCU_SPI2);
/* SPI5_CLK(PG13), SPI5_MISO(PG12), SPI5_MOSI(PG14),SPI5_IO2(PG10) and SPI5_IO3(PG11) GPIO pin configuration */
gpio_af_set(GPIOB, GPIO_AF_6, GPIO_PIN_3|GPIO_PIN_4);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3|GPIO_PIN_4);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_3|GPIO_PIN_4);
gpio_af_set(GPIOD, GPIO_AF_5, GPIO_PIN_6);
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_6);
/* SPI5_CS(PG9) GPIO pin configuration */
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_5);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
MCP2515_CS_HIGH();
rcu_periph_clock_enable(RCU_GPIOG);
// gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
gpio_mode_set(GPIOG, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_15);
exti_init(EXTI_15, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
nvic_irq_enable(EXTI10_15_IRQn, 2U, 0U);
/* connect key EXTI line to key GPIO pin */
syscfg_exti_line_config(EXTI_SOURCE_GPIOG,EXTI_SOURCE_PIN15);
/* configure key EXTI line */
exti_init(EXTI_15, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_15);
/* SPI5 parameter config */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; //传输模式
spi_init_struct.device_mode = SPI_MASTER; //配置SPI为主机
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; //数据帧格式配置
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; //相位和极性配置
spi_init_struct.nss = SPI_NSS_SOFT; //配置NSS由软件或硬件控制
spi_init_struct.prescale = SPI_PSC_16; //预分频器配置
spi_init_struct.endian = SPI_ENDIAN_MSB; //大端或小端模式配置
spi_init(SPI2, &spi_init_struct);
/* enable SPI5 */
spi_enable(SPI2);
#endif
#if 0
// spi_parameter_struct spi_init_struct;
rcu_periph_clock_enable(RCU_SYSCFG);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOD);
rcu_periph_clock_enable(RCU_SPI2);
/* SPI5_CLK(PG13), SPI5_MISO(PG12), SPI5_MOSI(PG14),SPI5_IO2(PG10) and SPI5_IO3(PG11) GPIO pin configuration */
gpio_af_set(GPIOB, GPIO_AF_6, GPIO_PIN_3|GPIO_PIN_4);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3|GPIO_PIN_4);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_3|GPIO_PIN_4);
gpio_af_set(GPIOD, GPIO_AF_5, GPIO_PIN_6);
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_6);
/* SPI5_CS(PG9) GPIO pin configuration */
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_5);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
MCP2515_CS_HIGH();
rcu_periph_clock_enable(RCU_GPIOG);
// gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
gpio_mode_set(GPIOG, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_15);
exti_init(EXTI_15, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
nvic_irq_enable(EXTI10_15_IRQn, 2U, 0U);
/* connect key EXTI line to key GPIO pin */
syscfg_exti_line_config(EXTI_SOURCE_GPIOG,EXTI_SOURCE_PIN15);
/* configure key EXTI line */
exti_init(EXTI_15, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_15);
/* SPI5 parameter config */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; //传输模式
spi_init_struct.device_mode = SPI_MASTER; //配置SPI为主机
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; //数据帧格式配置
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; //相位和极性配置
spi_init_struct.nss = SPI_NSS_SOFT; //配置NSS由软件或硬件控制
spi_init_struct.prescale = SPI_PSC_16; //预分频器配置
spi_init_struct.endian = SPI_ENDIAN_MSB; //大端或小端模式配置
spi_init(SPI2, &spi_init_struct);
/* enable SPI5 */
spi_enable(SPI2);
#endif
}
/**
* @brief 用于向NRF读/写一字节数据
* @param 写入的数据
* @arg dat
* @retval 读取得的数据
*/
// u8 SPI_MCP2515_RW(u8 dat)
// {
// /* 当 SPI发送缓冲器非空时等待 */
// while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
//
// /* 通过 SPI2发送一字节数据 */
// SPI_I2S_SendData(SPI1, dat);
//
// /* 当SPI接收缓冲器为空时等待 */
// while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
// /* Return the byte read from the SPI bus */
// return SPI_I2S_ReceiveData(SPI1);
// }
/*******************************************************************************
* 函数名 : SPI_ReadByte
* 描述 : 通过SPI读取一个字节数据
* 输入 : 无
* 输出 : 无
* 返回值 : rByte(读取到的一个字节数据)
* 说明 : 无
*******************************************************************************/
unsigned char SPI_ReadByte(void)
{
unsigned char i,rByte=0;
// MCP2515_SCK_LOW();
// for(i=0;i<8;i++)
// {
// delay_us_sys(10);
// MCP2515_SCK_HIGH();
//// delay_us_sys(1);
// rByte<<=1;
// rByte|=MCP2515_Read_MISO();
// MCP2515_SCK_LOW();
//// delay_us_sys(1);
// }
// return rByte;
//return spi_flash_send_byte(0XFF);
/* loop while data register in not emplty */
while(RESET == spi_i2s_flag_get(SPI2,SPI_FLAG_TBE));
/* send byte through the SPI5 peripheral */
spi_i2s_data_transmit(SPI2,0XFF);
/* wait to receive a byte */
while(RESET == spi_i2s_flag_get(SPI2,SPI_FLAG_RBNE));
/* return the byte read from the SPI bus */
return(spi_i2s_data_receive(SPI2));
//
}
uint8_t spi_flash_send_byte(uint8_t byte)
{
/* loop while data register in not emplty */
while(RESET == spi_i2s_flag_get(SPI2,SPI_FLAG_TBE));
/* send byte through the SPI5 peripheral */
spi_i2s_data_transmit(SPI2,byte);
/* wait to receive a byte */
while(RESET == spi_i2s_flag_get(SPI2,SPI_FLAG_RBNE));
/* return the byte read from the SPI bus */
return(spi_i2s_data_receive(SPI2));
}
/*******************************************************************************
* 函数名 : SPI_SendByte
* 描述 : SPI发送一个字节数据
* 输入 : dt:待发送的数据
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void SPI_SendByte(unsigned char dt)
{
unsi
CAN控制芯片mcp2515驱动程序
需积分: 24 171 浏览量
2022-09-29
10:32:54
上传
评论 1
收藏 6KB RAR 举报
鹿熙儿
- 粉丝: 0
- 资源: 2
最新资源
- 简单的Linux C代码,实现链表功能
- 汇编语言探索之旅:从基础到实践,解锁底层奥秘-markdown材料.zip
- Fortran语言:经典与现代交织的编程之旅-markdown材料.zip
- 基于python编写的appium自动化框架,采用PO模式,并集成了日志以及测试报告通过邮件发送的功能
- csdn.apk
- spleeter模型下载
- 微信小程序 - 图书管理系统源码.zip
- 微信小程序 - 图片自适应 ,富文本解析源码.zip
- 微信小程序 - 同乐居商城:购物车合算源码
- 1、根据输入的三条边值判断能组成何种三角形,并设计测试数据进行判定覆盖测试 三条边为变量a、b、c,范围为1≤边值≤10,不在范
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0