教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 专业资料 >

mcp2510的can总线收发器程序

来源:网络收集 时间:2026-09-06
导读: 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()

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字,全部文档内容请下载后查看。喜欢就下载吧 ……
mcp2510的can总线收发器程序.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1760491.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)