亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mcp2515.c

?? 基于S3C2410和Wince4.2操作系統的CAN總線驅動
?? C
字號:
/******************************************************************************
 * 
 * Controller Area Network (CAN) Demo-Application
 * Atmel AVR with Microchip MCP2515 
 * 
 * Copyright (C) 2005 Martin THOMAS, Kaiserslautern, Germany
 * <eversmith@heizung-thomas.de>
 * http://www.siwawi.arubi.uni-kl.de/avr_projects
 *
 *****************************************************************************
 *
 * File    : mcp2515.c
 * Version : 0.9
 * 
 * Summary : MCP2515 "low-level" driver
 *
 * Parts of this code are adapted from a MCP2510 sample-application 
 * by KVASER AB, http://www.kvaser.com (KVASER-code is marked as free)
 *
 * This code-module is free to use but you have to keep the copyright
 * notice.
 *
 *****************************************************************************/


#include "spi.h"

#include "mcp2515.h"
#include "can.h"

// Buffer can be MCP_TXBUF_0 MCP_TXBUF_1 or MCP_TXBUF_2
void mcp2515_write_canMsg(unsigned char buffer_sidh_addr, CanMessage * msg)
{
    unsigned char mcp_addr, dlc;

	mcp_addr = buffer_sidh_addr;
	dlc = msg->dlc;
	
    mcp2515_setRegisterS(mcp_addr+5, &(msg->dta[0]), dlc );  // write data bytes
    mcp2515_write_can_id( mcp_addr, msg->extended_identifier,msg->identifier );  // write CAN id
    if ( msg->rtr == 1)  dlc |= MCP_RTR_MASK;  // if RTR set bit in byte
    mcp2515_setRegister( (mcp_addr+4), dlc );  // write the RTR and DLC
}

void mcp2515_read_canMsg(unsigned char buffer_sidh_addr,CanMessage * msg)
{

    unsigned char mcp_addr, ctrl;

	mcp_addr = buffer_sidh_addr;
	
    mcp2515_read_can_id(mcp_addr, &(msg->extended_identifier),&(msg->identifier) );
    
	ctrl = mcp2515_readRegister( mcp_addr-1 );
    msg->dlc = mcp2515_readRegister( mcp_addr+4 );
    
	if ((ctrl & 0x08)) {
        msg->rtr = 1;
    } else {
        msg->rtr = 0;
    }
    
	msg->dlc &= MCP_DLC_MASK;
    mcp2515_readRegisterS( mcp_addr+5, &(msg->dta[0]), msg->dlc );
}

void mcp2515_read_can_id(unsigned char mcp_addr,unsigned char * ext,unsigned int * can_id )
{ 
    char tbufdata[4];
	
    *ext = 0;
    *can_id = 0;
    
	mcp2515_readRegisterS( mcp_addr, tbufdata, 4 );
    
	*can_id = (tbufdata[MCP_SIDH]<<3) + (tbufdata[MCP_SIDL]>>5);
	
    if ( (tbufdata[MCP_SIDL] & MCP_TXB_EXIDE_M) ==  MCP_TXB_EXIDE_M ) {
		// extended id
        *can_id = (*can_id<<2) + (tbufdata[MCP_SIDL] & 0x03);
        *can_id <<= 16;
        *can_id = *can_id +(tbufdata[MCP_EID8]<<8) + tbufdata[MCP_EID0];
        *ext = 1;
    }
}

void mcp2515_readRegisterS(unsigned char address,char values[], unsigned char n)
{
	unsigned char i;
	
	MCP2515_SELECT();
	WriteSPI(MCP_READ);
	WriteSPI(address);
	// mcp2515 has auto-increment of address-pointer
	for (i=0; i<n; i++) {
		values[i] = ReadSPI();
	}
	MCP2515_UNSELECT();
}


void mcp2515_reset(void)
{
   
	MCP2515_SELECT();
	WriteSPI(MCP_RESET);
	MCP2515_UNSELECT();
}

unsigned char mcp2515_readRegister(const unsigned char address)
{
	unsigned char ret;
	
	MCP2515_SELECT();
	WriteSPI(MCP_READ);
	WriteSPI(address);
	ret = ReadSPI();
	MCP2515_UNSELECT();
	
	return ret;
}


void mcp2515_setRegister(const unsigned char address, const unsigned char value)
{
	MCP2515_SELECT();
	WriteSPI(MCP_WRITE);
	WriteSPI(address);
	WriteSPI(value);
	MCP2515_UNSELECT();
}


void mcp2515_modifyRegister(const unsigned char address, 
	const unsigned char mask, const unsigned char data)
{
	MCP2515_SELECT();
	WriteSPI(MCP_BITMOD);
	WriteSPI(address);
	WriteSPI(mask);
	WriteSPI(data);
	MCP2515_UNSELECT();
}

static unsigned char mcp2515_readXXStatus_helper(const unsigned char cmd)
{
	unsigned char i;
	
	MCP2515_SELECT();
	WriteSPI(cmd);
	i = ReadSPI();
	MCP2515_UNSELECT();
	
	return i;
}

	
unsigned char mcp2515_readStatus(void)
{
	return mcp2515_readXXStatus_helper(MCP_READ_STATUS);
}

unsigned char mcp2515_RXStatus(void)
{
	return mcp2515_readXXStatus_helper(MCP_RX_STATUS);
}

unsigned char mcp2515_setCANCTRL_Mode(const unsigned char newmode)
{
	unsigned char i;
	
	mcp2515_modifyRegister(MCP_CANCTRL, MODE_MASK, newmode);
	
	// verify as advised in datasheet
	i = mcp2515_readRegister(MCP_CANCTRL);
	i &= MODE_MASK;
	
	if ( i == newmode ) {
		return MCP2515_OK; 
	}
	else {
		return MCP2515_FAIL;
	}
}


unsigned char mcp2515_configRate(const unsigned char canSpeed)
{
	unsigned char set, cfg1, cfg2, cfg3;
	
	set = 0;
	
	switch (canSpeed) {
		case (CAN_125KBPS) :
			cfg1 = MCP_4MHz_125kBPS_CFG1 ;
			cfg2 = MCP_4MHz_125kBPS_CFG2 ;
			cfg3 = MCP_4MHz_125kBPS_CFG3 ;
			set = 1;
			break;
		case (CAN_20KBPS) :
			cfg1 = MCP_4MHz_20kBPS_CFG1 ;
			cfg2 = MCP_4MHz_20kBPS_CFG2 ;
			cfg3 = MCP_4MHz_20kBPS_CFG3 ;
			set = 1;
			break;
		default:
			set = 0;
			break;
	}
	
	if (set) {
		mcp2515_setRegister(MCP_CNF1, cfg1);
		mcp2515_setRegister(MCP_CNF2, cfg2);
		mcp2515_setRegister(MCP_CNF3, cfg3);
		return MCP2515_OK;
	}
	else {
		return MCP2515_FAIL;
	}
} 


/*
 ** Start the transmission from one of the tx buffers.
 */
// Buffer can be MCP_TXBUF_0 MCP_TXBUF_1 or MCP_TXBUF_2
void mcp2515_start_transmit(const unsigned char buffer_sidh_addr)
{
	// TXBnCTRL_addr = TXBnSIDH_addr - 1
	
	
	switch(buffer_sidh_addr)
	{
	   case 0x31: MCP2515_SELECT();
	              WriteSPI(0x81);
	              MCP2515_UNSELECT();
	              break;
	   case 0x41: MCP2515_SELECT();
	              WriteSPI(0x82);
	              MCP2515_UNSELECT();
	              break;
	   case 0x51: MCP2515_SELECT();
	              WriteSPI(0x84);
	              MCP2515_UNSELECT();
	              break;
	}
//    mcp2515_modifyRegister( buffer_sidh_addr-1 , MCP_TXB_TXREQ_M|MCP_TXB_TXP10_M|MCP_TXB_ABTF_M|MCP_TXB_MLOA_M|MCP_TXB_TXERR_M, 
//		MCP_TXB_TXREQ_M|MCP_TXB_TXP10_M|(0x00));
}

void mcp2515_setRegisterS(unsigned char address,char values[],unsigned char n)
{
	unsigned char i;
	
	MCP2515_SELECT();
	WriteSPI(MCP_WRITE);
	WriteSPI(address);
	// mcp2515 has auto-increment of address-pointer
	for (i=0; i<n; i++) {
		WriteSPI(values[i]);
	}
	MCP2515_UNSELECT();
}


void mcp2515_write_can_id( const unsigned char mcp_addr, 
	const unsigned char ext, const unsigned int can_id )
{
    unsigned int canid;
    char tbufdata[4];
	
    canid = (unsigned int)(can_id & 0x0FFFF);
    
	if ( ext == 1) {
        tbufdata[MCP_EID0] = (unsigned char) (canid & 0xFF);
        tbufdata[MCP_EID8] = (unsigned char) (canid / 256);
        canid = (unsigned int)( can_id / 0x10000L );
        tbufdata[MCP_SIDL] = (unsigned char) (canid & 0x03);
        tbufdata[MCP_SIDL] += (unsigned char) ((canid & 0x1C )*8);
        tbufdata[MCP_SIDL] |= MCP_TXB_EXIDE_M;
        tbufdata[MCP_SIDH] = (unsigned char) (canid / 32 );
    }
    else {
        tbufdata[MCP_SIDH] = (unsigned char) (canid>>3 );
        tbufdata[MCP_SIDL] = (unsigned char) ((canid & 0x07 )<<5);
        tbufdata[MCP_EID0] = 0;
        tbufdata[MCP_EID8] = 0;
    }
	mcp2515_setRegisterS( mcp_addr, tbufdata, 4 );
}

void mcp2515_initCANBuffers(void)
{
	unsigned char i, a1, a2, a3;
	
	// TODO: check why this is needed to receive extended 
	//   and standard frames
	// Mark all filter bits as don't care:
    mcp2515_write_can_id(MCP_RXM0SIDH, 0, 0);
    mcp2515_write_can_id(MCP_RXM1SIDH, 0, 0);
    // Anyway, set all filters to 0:
    mcp2515_write_can_id(MCP_RXF0SIDH, 1, 0); // RXB0: extended 
    mcp2515_write_can_id(MCP_RXF1SIDH, 0, 0); //       AND standard
    mcp2515_write_can_id(MCP_RXF2SIDH, 1, 0); // RXB1: extended 
    mcp2515_write_can_id(MCP_RXF3SIDH, 0, 0); //       AND standard
    mcp2515_write_can_id(MCP_RXF4SIDH, 0, 0);
    mcp2515_write_can_id(MCP_RXF5SIDH, 0, 0);
	
	// Clear, deactivate the three transmit buffers
	// TXBnCTRL -> TXBnD7
    a1 = MCP_TXB0CTRL;
	a2 = MCP_TXB1CTRL;
	a3 = MCP_TXB2CTRL;
    for (i = 0; i < 14; i++) { // in-buffer loop
		mcp2515_setRegister(a1, 0);
		mcp2515_setRegister(a2, 0);
		mcp2515_setRegister(a3, 0);
        a1++;
		a2++;
		a3++;
    }
	
    // and clear, deactivate the two receive buffers.
    mcp2515_setRegister(MCP_RXB0CTRL, 0);
    mcp2515_setRegister(MCP_RXB1CTRL, 0);
	mcp2515_setRegister(MCP_CANINTE,0xff);
}


// ---

unsigned char mcp2515_Init(const unsigned char canSpeed)
{
	unsigned char res;
	
	MCP2515_SELECT();
	
	mcp2515_reset();
	
	res = mcp2515_setCANCTRL_Mode(MODE_CONFIG);
	
	if ( res == MCP2515_FAIL ) return res;  /* function exit on error */
	
	res = mcp2515_configRate(canSpeed);
	
		mcp2515_initCANBuffers();
		
		// enable both receive-buffers to receive any message
		// and enable rollover
		mcp2515_modifyRegister(MCP_RXB0CTRL, 
			MCP_RXB_RX_MASK | MCP_RXB_BUKT_MASK, 
			MCP_RXB_RX_ANY | MCP_RXB_BUKT_MASK);
		mcp2515_modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, 
			MCP_RXB_RX_ANY);
	
 
	mcp2515_modifyRegister(MCP_CANINTE,0x03,0x03);
	while(!(mcp2515_setCANCTRL_Mode(MODE_NORMAL) == MCP2515_OK));
	
	return res;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
九九精品一区二区| 日韩主播视频在线| 日韩欧美高清dvd碟片| 成人黄页毛片网站| 欧美aⅴ一区二区三区视频| 日韩一区日韩二区| 国产喷白浆一区二区三区| 欧美日韩国产另类不卡| 91亚洲大成网污www| 国产一区二区三区在线观看精品| 亚洲综合久久久| 国产精品久久久一区麻豆最新章节| 日韩午夜激情av| 欧美偷拍一区二区| 色综合久久99| 不卡视频在线观看| 国产成人综合在线播放| 美女看a上一区| 性久久久久久久久久久久 | 2020国产成人综合网| 欧美图片一区二区三区| 色屁屁一区二区| 成人午夜免费视频| 国产91丝袜在线18| 国产成人精品午夜视频免费| 精品夜夜嗨av一区二区三区| 日韩电影在线免费看| 亚洲影院在线观看| 一区二区三区毛片| 亚洲人成在线观看一区二区| 日韩伦理电影网| 中文字幕一区二区三区不卡 | 欧美三片在线视频观看| 色94色欧美sute亚洲13| 97se狠狠狠综合亚洲狠狠| 高清不卡在线观看| 国产**成人网毛片九色| 大陆成人av片| 岛国精品在线播放| 95精品视频在线| 色综合天天天天做夜夜夜夜做| 色综合天天视频在线观看| 在线观看91精品国产入口| 欧美系列日韩一区| 欧美日韩精品一二三区| 91精品国产91久久综合桃花| 91精品国产综合久久久久| 91精品国产综合久久久久久久久久 | 日韩一级高清毛片| 精品乱人伦一区二区三区| 精品国产91九色蝌蚪| 精品粉嫩超白一线天av| 国产片一区二区| 亚洲男人天堂一区| 亚洲国产精品久久久久秋霞影院 | 国产成人av一区二区| 成人黄色小视频在线观看| caoporn国产一区二区| 91亚洲资源网| 欧美高清你懂得| 91精品国产综合久久精品图片| 日韩欧美国产午夜精品| 国产亚洲成年网址在线观看| 日本一区免费视频| 一区二区三区日韩在线观看| 视频一区在线视频| 国产精品一二三| 色综合久久精品| 日韩一区二区三区免费看 | 欧美一区二区三区四区高清| 欧美哺乳videos| 中文字幕欧美一| 婷婷综合另类小说色区| 激情综合网天天干| 99久久国产综合精品女不卡| 欧美日韩国产经典色站一区二区三区| 精品少妇一区二区三区视频免付费| 久久久精品黄色| 一区二区三区中文字幕在线观看| 免费人成精品欧美精品| 成人黄色777网| 欧美男生操女生| 国产精品麻豆欧美日韩ww| 亚洲国产综合人成综合网站| 久久国产精品99久久久久久老狼 | 久久疯狂做爰流白浆xx| 91在线观看污| 日韩欧美第一区| 亚洲欧美一区二区三区国产精品 | 国产精品12区| 欧美精品精品一区| 成人欧美一区二区三区| 久久99蜜桃精品| 欧美无砖专区一中文字| 国产精品日韩精品欧美在线| 日本成人超碰在线观看| 色www精品视频在线观看| 91在线观看视频| 欧美大黄免费观看| 中文字幕一区二区三区不卡在线| 亚洲第一久久影院| 成人av网站免费| 精品处破学生在线二十三| 亚洲第一在线综合网站| 99久久伊人精品| 久久久亚洲欧洲日产国码αv| 午夜精品一区二区三区三上悠亚| 99久久精品免费看| 国产午夜精品久久久久久久 | 欧美三级电影在线看| 国产精品沙发午睡系列990531| 麻豆91精品视频| 欧美精品精品一区| 亚洲高清中文字幕| 色婷婷综合久久| 国产精品国产三级国产aⅴ原创 | 欧美三电影在线| 亚洲视频一区二区在线观看| 国产jizzjizz一区二区| 久久亚洲精品小早川怜子| 蜜臀久久99精品久久久久宅男| 欧美性大战久久久久久久| 亚洲激情自拍视频| 91色.com| 亚洲人成精品久久久久| 91捆绑美女网站| 综合激情成人伊人| 99热国产精品| **欧美大码日韩| 99久久er热在这里只有精品15| 国产精品女人毛片| 成人毛片视频在线观看| 欧美激情一区二区| 国产一区二区在线观看免费| 久久尤物电影视频在线观看| 国产剧情在线观看一区二区| 久久久国产精品午夜一区ai换脸| 蜜臀精品一区二区三区在线观看 | 欧美韩国日本不卡| 不卡的av在线| 成人免费在线视频| 欧美性猛片xxxx免费看久爱| 亚洲国产成人高清精品| 欧美一区二区播放| 久久精品国产澳门| 国产亚洲va综合人人澡精品| 成人精品视频一区| 亚洲欧美另类久久久精品2019| 欧美亚洲国产bt| 免费成人av在线| 国产亚洲女人久久久久毛片| 成人网在线免费视频| 一区二区三区免费看视频| 欧美日韩日日摸| 久久精品国产亚洲5555| 久久理论电影网| 91天堂素人约啪| 亚洲成人av福利| 精品国产亚洲在线| 成人深夜视频在线观看| 亚洲影视资源网| 日韩精品一区二区三区中文精品| 国产精品一区二区在线看| 综合久久久久久| 91麻豆精品国产91久久久资源速度 | av毛片久久久久**hd| 亚洲午夜三级在线| 精品少妇一区二区三区视频免付费| 国产成人精品影视| 亚洲一二三级电影| 精品久久久久久综合日本欧美| av一区二区三区黑人| 手机精品视频在线观看| 2023国产一二三区日本精品2022| 91麻豆精品秘密| 久久精品国产免费看久久精品| 国产精品久久网站| 欧美一区二区播放| 99综合电影在线视频| 日欧美一区二区| 国产精品高潮呻吟久久| 777a∨成人精品桃花网| 波多野结衣精品在线| 免费在线一区观看| 国产精品三级电影| 日韩午夜激情免费电影| 色综合天天性综合| 国产精品中文字幕日韩精品 | 亚洲欧美综合在线精品| 欧美一区二区三区四区在线观看| av午夜精品一区二区三区| 久久精品国产精品亚洲综合| 一区二区三区四区在线播放| 久久久久国产精品人| 欧美精品自拍偷拍动漫精品| 成人av资源站| 国产一区在线精品| 午夜精品久久久久久久久| 国产精品高清亚洲| 久久影院视频免费|