at91用c语言编程,AT91+MCP2515驱动C语言程序

#include "AT91RM9200.h"

#include "lib_AT91RM9200.h"

#include "AT91_SPI.h"

#include "MCP2515.h"

/*****************************************************************************

函数功能:MCP2515初始化

入口参数:无

返    回:无

备    注:无

******************************************************************************/

void MCP2515_Init()

{

//复位MCP2515

MCP2515_SPI_CMD( MCP2515_CMD_RESET, ARG_UNUSED, ARG_UNUSED, ARG_UNUSED );

//进入配置模式

MCP2515_SPI_CMD( MCP2515_CMD_BITMOD, TO_UINT(&(MCP2515_MAP->CANCTRL)), 0xe0, 0x80 );

//配置相关引脚

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->BFPCTRL)), BFPCTRL_INIT_VAL, ARG_UNUSED);

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXRTSCTRL)), TXRTSCTRL_INIT_VAL, ARG_UNUSED);

//设置波特率(125k)

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CNF1)), CNF1_INIT_VAL, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CNF2)), CNF2_INIT_VAL, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CNF3)), CNF3_INIT_VAL, ARG_UNUSED );

//配置中断

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CANINTE)), CANINTE_INIT_VAL, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->CANINTF)), CANINTF_INIT_VAL, ARG_UNUSED );

//复位MCP2515的错误标志寄存器

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->EFLG)), EFLG_INIT_VAL, ARG_UNUSED);

//配置TXBnCTRL(发送缓冲器控制寄存器)

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0CTRL)), TXBnCTRL_INIT_VAL, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB1CTRL)), TXBnCTRL_INIT_VAL, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB2CTRL)), TXBnCTRL_INIT_VAL, ARG_UNUSED );

//配置接收缓冲器控制寄存器

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXB0CTRL)), RXB0CTRL_INIT_VAL, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXB1CTRL)), RXB1CTRL_INIT_VAL, ARG_UNUSED );

//配置MCP2515的验收滤波寄存器

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXF0SIDL)), RXF0SIDL_INIT_VAL, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXF0SIDH)), RXF0SIDH_INIT_VAL, ARG_UNUSED );

//配置MCP2515的验收屏蔽寄存器

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXM0SIDL)), RXM0SIDL_INIT_VAL, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->RXM0SIDH)), RXM0SIDH_INIT_VAL, ARG_UNUSED );

//进入正常工作模式

MCP2515_SPI_CMD( MCP2515_CMD_BITMOD, TO_UINT(&(MCP2515_MAP->CANCTRL)), 0xe7, 0x04 );

}

/******************************** End of Function ****************************/

/*****************************************************************************

函数功能:MCP2515相关命令操作

入口参数:cmd: 对MCP2515的相关命令; add: 地址信息; arg1,arg2: 命令的相关参数

返    回:若命令要求有返回值,则返回相应的数据;如果没有返回值的,则返回0

备    注:无

******************************************************************************/

unsigned char MCP2515_SPI_CMD( unsigned char cmd, unsigned char addr, unsigned char arg1, unsigned char arg2 )

{

unsigned char data = 0x00;

switch(cmd)

{

case MCP2515_CMD_RESET:

AT91_SPI_SendByte( MCP2515_CMD_RESET );

break;

case MCP2515_CMD_BITMOD:

AT91_SPI_SendByte( MCP2515_CMD_BITMOD );

AT91_SPI_SendByte( addr );

AT91_SPI_SendByte( arg1 );

AT91_SPI_SendByte( arg2 );

break;

case MCP2515_CMD_WRITE:

AT91_SPI_SendByte( MCP2515_CMD_WRITE );

AT91_SPI_SendByte( addr );

AT91_SPI_SendByte( arg1 );

break;

case MCP2515_CMD_READ:

AT91_SPI_SendByte( MCP2515_CMD_READ );

AT91_SPI_SendByte( addr );

data = AT91_SPI_ReadByte();

break;

default:

data = 0x00;

break;

}

return data;

}

/******************************** End of Function ****************************/

/*****************************************************************************

函数功能:MCP2515发送一帧数据

入口参数:TXnBuf: 选择发送缓冲器; IDType: 标准帧或者扩展帧选择; id: 发送数据的ID号;

DataLen: 发送的数据长度; SendData: 指向要发送数据的首地址

返    回:无

备    注:无

******************************************************************************/

void MCP2515_TX( int TXnBuf, int IDType, unsigned int id, int DataLen, unsigned char *SendData )

{

int i, offset;

unsigned flag;

unsigned char finish;

switch( TXnBuf )

{

case TXBUF0:

offset = 0;

flag = 0x04;

break;

case TXBUF1:

offset = 0x10;

flag = 0x08;

break;

case TXBUF2:

offset = 0x20;

flag = 0x10;

break;

}

//发送帧ID

if( IDType == STAND_ID )

{

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDL))+offset, (id<<5)&0xe0, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDH))+offset, (id>>3)&0xff, ARG_UNUSED );

}

else if( IDType == EXT_ID )

{

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0EID0))+offset, id&0xff, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0EID8))+offset, (id>>8)&0xff, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDL))+offset, ((id>>16)&0x03)|((id>>13)&0xe0)|0x08, ARG_UNUSED );

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0SIDH))+offset, (id>>21)&0xff, ARG_UNUSED );

}

//判别数据长度,若数据长度大于8,则取前8个数据

if( DataLen>8 )

DataLen = 8;

//发送数据长度

MCP2515_SPI_CMD( MCP2515_CMD_WRITE, TO_UINT(&(MCP2515_MAP->TXB0DLC))+offset, DataLen, ARG_UNUSED );

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值