mcp2510的can总线收发器程序
mcp2510的can总线收发器程序
mcp2510的can总线收发器程序
pcbomb 发表于 2008-6-30 14:47:00 阅读全文(769) | 回复(1) | 引用通告(0) | 编辑
#i nclude <stdio.h>
#i nclude "mcp2510.h"
void mcp_reset(void)
{
SPI_init_hw(); //设置成SPI方式
init_can_io(); //
SPI_mcp_reset(); //
}
void mcp_read( unsigned char MCPaddr, unsigned char* readdata, unsigned char length ) {
unsigned char loopCnt;
SPI_mcp_select(); // Select the MCP device at the SPI bus
// Start reading and set first address
SPI_mcp_RD_address(MCPaddr);
for (loopCnt=0; loopCnt < length; loopCnt++)
{
// Get a byte and store at pointer
*readdata = SPI_putch(MCPaddr);
// Increment the pointers to next location
// Test++;
MCPaddr++;
readdata++;
}
SPI_mcp_unselect();
}
void mcp_write( unsigned char MCPaddr, unsigned char* writedata, unsigned char length ) {
unsigned char loopCnt;
SPI_mcp_select();
// Start write and set first address
SPI_mcp_WR_address( MCPaddr );
for (loopCnt=0; loopCnt < length; loopCnt++)
{
// Write a byte
SPI_putch( *writedata );
// Increment the pointer to next location
writedata++;
}
mcp2510的can总线收发器程序
SPI_mcp_unselect();
}
void mcp_read_can_id( unsigned char mcp_addr, unsigned char* ext, unsigned long* can_id ) {
unsigned char tbufdata[4];
*ext = 0;
*can_id = 0;
mcp_read( mcp_addr, tbufdata, 4);
*can_id = (tbufdata[SIDH]<<3) + (tbufdata[SIDL]>>5);
if ( (tbufdata[SIDL] & TXB_EXIDE_M) == TXB_EXIDE_M )
{
*can_id = (*can_id<<2) + (tbufdata[SIDL] & 0x03);
*can_id <<= 16;
*can_id = *can_id +(tbufdata[EID8]<<8) + tbufdata[EID0];
*ext = 1;
}
}
/*******************************************************************************************************
buffer:0-1
*******************************************************************************************************/
void mcp_read_can( unsigned char buffer, unsigned char* ext, unsigned long* can_id, unsigned char* dlc, unsigned char* rtr, unsigned char* data )
{
unsigned char mcp_addr = buffer*16 + 0x61, ctrl;
mcp_read_can_id( mcp_addr, ext, can_id );
mcp_read( mcp_addr-1, &ctrl, 1 );
mcp_read( mcp_addr+4, dlc, 1 );
if (/*(*dlc & RTR_MASK) || */(ctrl & 0x08))
{
*rtr = 1;
}
else
{
*rtr = 0;
}
*dlc &= DLC_MASK;
mcp_read( mcp_addr+5, data, *dlc );
}
void mcp_write_can_id( unsigned char mcp_addr, unsigned char ext, unsigned long can_id )
mcp2510的can总线收发器程序
{
unsigned int canid;
unsigned char tbufdata[4];
canid = (unsigned int)(can_id & 0x0FFFF);
if ( ext == 1)
{
tbufdata[EID0] = (unsigned char) (canid & 0xFF);
tbufdata[EID8] = (unsigned char) (canid / 256);
canid = (unsigned int)( can_id / 0x10000 );
tbufdata[SIDL] = (unsigned char) (canid & 0x03);
tbufdata[SIDL] += (unsigned char) ((canid & 0x1C )*8);
tbufdata[SIDL] |= TXB_EXIDE_M;
tbufdata[SIDH] = (unsigned char) (canid / 32 );
}
else
{
tbufdata[SIDH] = (unsigned char) (canid / 8 );
tbufdata[SIDL] = (unsigned char) ((canid & 0x07 )*32);
tbufdata[EID0] = 0;
tbufdata[EID8] = 0;
}
mcp_write( mcp_addr, tbufdata, 4 );
}
/*******************************************************************************************************
buffer:0-2
*******************************************************************************************************/
void mcp_write_can( unsigned char buffer, unsigned char ext, unsigned long can_id, unsigned char dlc, unsigned char rtr, unsigned char* data )
{
unsigned char mcp_addr = buffer*16 + 0x31;
mcp_write(mcp_addr+5, data, dlc ); // write data bytes
mcp_write_can_id( mcp_addr, ext, can_id ); // write CAN id
if ( rtr == 1)
{
dlc |= RTR_MASK; // if RTR set bit in byte
}
mcp_write((mcp_addr+4), &dlc, 1 ); // write the RTR and DLC }
/*******************************************************************************************************
检测是否发送完毕,是否已经可以进行发送
********************************************************************************************
mcp2510的can总线收发器程序
***********/
unsigned char mcp_transmit_busy(unsigned send_buf)
{
unsigned char temp;
switch(send_buf)
{
case 0:
{
temp=SPI_mcp_RD_status();//读取当前的MCP2510发送状态
if(temp&0x04)
{
return 1;
}
return 0;
break;
}
case 1:
{
temp=SPI_mcp_RD_status();//读取当前的MCP2510发送状态
if(temp&0x10)
{
return 1;
}
return 0;
break;
}
case 2:
{
temp=SPI_mcp_RD_status();//读取当前的MCP2510发送状态
if(temp&0x40)
{
return 1;
}
return 0;
break;
}
}
}
/*******************************************************************************************************
发送数据
*******************************************************************************************************/
void mcp_transmit(unsigned char mcp_addr)
mcp2510的can总线收发器程序
{
SPI_mcp_write_bits(mcp_addr, TXB_TXREQ_M, TXB_TXREQ_M);
}
#include "spi_mcp.h"
void SPI_mcp_select (void)
…… 此处隐藏:4551字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [专业资料]《蜜蜂之家》教学反思
- [专业资料]过去分词作定语和表语1
- [专业资料]苏州工业园区住房公积金贷款申请表
- [专业资料]保安管理制度及处罚条例细则
- [专业资料]2018年中国工程咨询市场发展现状调研及
- [专业资料]2015年电大本科《学前教育科研方法》期
- [专业资料]数字信号处理实验 matlab版 离散傅里叶
- [专业资料]“十三五”重点项目-虎杖白藜芦醇及功
- [专业资料]2015-2020年中国竹木工艺市场需求及投
- [专业资料]国际贸易理论与实务作业五:理论案例分
- [专业资料]财政部修订发布事业单位会计制度
- [专业资料]BCA蛋白浓度测定试剂盒(增强型)
- [专业资料]工程进度总计划横道图模板(通用版)
- [专业资料]七年级地理同步练习(天气与气候)
- [专业资料]X光安检机介绍火灾自动报警系统的组成
- [专业资料]衢州市人民政府办公室关于印发衢州市区
- [专业资料]经济全球化及其影响[1]
- [专业资料]质粒DNA限制性酶切图谱分析
- [专业资料]国家安全人民防线工作“六项”制度
- [专业资料]劳动力投入计划及保证措施
- 电子账册联网监管培训手册
- 人教版语文七年级上第1课《在山的那边
- 对我区担保行业发展现状的思考与建议
- 平面四边形网格自动生成方法研究
- 2016年党课学习心得体会范文
- 如何设置电脑定时关机
- 全球最美人妖排行榜新鲜出炉
- 社会实践调查报告及问卷
- Visual Basic习题集
- 《鱼我所欲也》课件2
- 浙江省会计从业资格考试试卷
- 全遥控数字音量控制的D 类功率放大器资
- 鞍钢宪法与后福特主义
- 电表的改装与校准实验报告(1)
- 2014年高考理科数学真题解析分类汇编:
- Windows 7 AIK 的使用
- 风电场全场停电事故应急处置方案
- 化工原理选填题题库(下)
- 关于产学研合作教育模式的学习与思考
- 西安先锋公馆项目前期定位报告




