日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2024年08月27日(星期二)

正在發(fā)生

2020年08月27日 | PIC16F887 SPI CAN 傳輸,操作MCP2515

發(fā)布者:GHR2596 來源: eefocus關(guān)鍵字:PIC16F887  SPI  CAN  傳輸  操作MCP2515 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

主函數(shù):


#include

#include

#include

 

#define uchar unsigned char

#define uint  unsigned int

#define nop() asm("nop")

#define CS    RD1 //標(biāo)簽為CANCSRH4

#define RESET  RD0  //標(biāo)簽為RESETCAN

 

__CONFIG (CP_OFF &WDTE_OFF& BOREN_OFF&PWRTE_OFF &FOSC_HS&WRT_OFF&LVP_OFF&CPD_OFF);

 

void Init_Int(void);//初始化中斷

void Init_Can(void);//初始化CAN通訊

void interrupt ISR(void);//中斷處理函數(shù)

void delay(unsigned int n);//毫秒延時(shí)函數(shù)

void CAN_Set_Var(uchar address,uchar mask,uchar dat);//修改寄存器的值,mask為掩碼

void Init_Spi(void);//初始化SPI

void SPISendByte(unsigned char dat);//SPI 發(fā)送一個(gè)字節(jié)數(shù)據(jù)

char SPIRecvByte(void);//SPI 讀取一個(gè)字節(jié)數(shù)據(jù)

void CAN_Write_SS(uchar address ,uchar Value);//往MCP2515寫一個(gè)字節(jié)數(shù)

char CAN_Read_SS(uchar address);//從MCP2515讀一個(gè)字節(jié)數(shù)

//void CAN_Send_End(void);//CAN發(fā)送程序 

void CAN_Send(unsigned char *CAN_TX_Buf);//發(fā)送數(shù)據(jù)

void SPIReset(void);//SPI復(fù)位

void CAN_writetxb0id(unsigned int txb0id);

 

unsigned char dummy;

unsigned char cansentbuf[8];

unsigned char canrecbuf[8];

 

void main()

{

 

Init_Int();//初始化中斷

 

//SPI init

Init_Spi();//初始化SPI

 

//can init

RESET=0;

delay(100);

RESET=1;

delay(100);

 

 

 

Init_Can();//初始化CAN通訊

 

CAN_writetxb0id(0x0025);

cansentbuf[0]=1;

cansentbuf[1]=0;

cansentbuf[2]=0x29;

cansentbuf[3]=0;

cansentbuf[4]=0;

cansentbuf[5]=0;

cansentbuf[6]=0;

cansentbuf[7]=0;

// for(bats2chloop=3;bats2chloop<8;bats2chloop++)

// {

// cansentbuf[bats2chloop]=0;

// }

// cansentbuf[5]=batleft;

// cansentbuf[6]=batright;

 

 

/*發(fā)一幀數(shù)據(jù)*/

CAN_Send(cansentbuf);

 

 

while(1)

{

//發(fā)送數(shù)據(jù)

CAN_writetxb0id(0x0025);//幀ID

// cansentbuf[0]=1;

// cansentbuf[1]=0;

// cansentbuf[2]=0x29;

// cansentbuf[3]=0;

// cansentbuf[4]=0;

// cansentbuf[5]=0;

// cansentbuf[6]=0;

// cansentbuf[7]=0;

CAN_Send(cansentbuf);

// CAN_Send(cansentbuf);

// delay(100);

 

// SPISendByte(0XAA);

// SPISendByte(0X00);

// SPISendByte(0X00);

delay(100);

}

 

 

}

 

 

//初始化中斷

void Init_Int(void)

{

OPTION_REG = 0b00000000;//B口弱上拉,RB0為下降沿觸發(fā)中斷

TRISB      = 0b00000001;//設(shè)定RB0為輸入,其余為輸出

INTCON     = 0b10010000;//允許RB0/INT中斷

}

 

//初始化SPI

void Init_Spi(void)

{

TRISC=0b00010000;//RC5/SDO為輸出,RD4/SDI為輸入,RC3/SCK為輸出

 

//SSPSTAT_SMP=0;//在數(shù)據(jù)輸出時(shí)間的中間采樣輸入數(shù)據(jù)

//CKE:SPI 時(shí)鐘邊沿選擇位   CKP = 0: STAT_CKE=1 在SCK 引腳的上升沿發(fā)送數(shù)據(jù)

//SSPSTAT=0X80;//在數(shù)據(jù)輸出時(shí)間的末尾采樣輸入數(shù)據(jù)

SSPSTAT=0X40;//在數(shù)據(jù)輸出時(shí)間的中間采樣輸入數(shù)據(jù)  bit 7,SMP=0,采樣位

 

//SSPEN=1;//SPI串口使能

//CKP=0;//空閑時(shí)鐘為低電平

//SSPCON+=0b0001;//SPI主控模式,時(shí)鐘為Fosc/16

/*SSPEN=1;使能串行端口;CKP=2,時(shí)鐘空閑狀態(tài)為高電平

SSPM<3:0>=0001,主控模式,時(shí)鐘=Fosc/16

*/

//SSPCON=0x31;

SSPCON=0x21;//bit 4,CKP:時(shí)鐘極性選擇位,0 = 時(shí)鐘空閑狀態(tài)為低電平

 

TRISD=0b00000000;//RD1輸出;RD0輸出;

}

 

 

 

//中斷服務(wù)程序

void interrupt ISR(void)

{

// if(INTF==1)//如果是INT中斷才執(zhí)行以下程序

// {

//

// INTF==1;//清中斷標(biāo)志位

// }

 

uchar Sta_Int,i;

Sta_Int=CAN_Read_SS(0X2C);//讀中斷標(biāo)志寄存器

CAN_Write_SS(0X2C,0x00);//清除所有中斷標(biāo)志位

/*如果為接收緩沖器0中斷*/

if(Sta_Int & 0x01)

{

for(i=0;i<12;i++)

{

//Put_Char(CAN_Read_SS(0x60+i)); 

}

//com_fs=com_fs+12

}

}

 

//延時(shí)(n)ms

void delay(unsigned int n)

{

unsigned int j;

char k;

for(j=0;j for(k=246;k>0;k--)

nop();

}

 

 

 

 

 

 

 

 

//SPI 讀取一個(gè)字節(jié)數(shù)據(jù)

char SPIRecvByte(void)

{

//從MISO線上讀取一個(gè)數(shù)據(jù)字節(jié)

char BUF;

// SPISendByte(0x01);

// SPISendByte(0x80|0x00);

// nop();//延時(shí)

// SPISendByte(0);//給SSPBUF一個(gè)0,才能開始讀取SSPBUF的數(shù)據(jù)

SSPBUF=0x00;

delay(2);

BUF=SSPBUF;

delay(20);

return BUF;

}

 

//SPI 發(fā)送一個(gè)字節(jié)數(shù)據(jù)

void SPISendByte(unsigned char dat)

{

SSPBUF=dat;//往緩沖里面寫入dat

// while(!SSPIF)//等待寫入成功

// SSPIF=0;//SSPIF清零

delay(20);

}

 

//往MCP2515指定地址addr寫一個(gè)字節(jié)數(shù)據(jù)value

void CAN_Write_SS(uchar address ,uchar Value)

{

CS=0;

SPISendByte(0x02);//寫命令

SPISendByte(address);//寫地址

SPISendByte(Value);//寫數(shù)據(jù)

CS=1;

}

 

 

//從MCP2515指定地址addr讀取一個(gè)字節(jié)數(shù)據(jù)value

char CAN_Read_SS(uchar address)

{

char BUF;

CS=0;

// delay(5);

SPISendByte(0x03);//讀命令

SPISendByte(address);//讀地址

BUF=SPIRecvByte();//讀一個(gè)字節(jié)數(shù)據(jù)

CS=1;

return BUF;

}

 

//SPI復(fù)位

void SPIReset(void)

{

// CS=LOW;

// WriteSPI(CAN_RESET);

// CS=HIGH;

CS=0;

SSPBUF=0XC0;//CAN_RESET=0XC0

// RESET=1;

// RESET=0;

delay(20);

// RESET=1;

CS=1;

}

 

/**修改寄存器的值**/

//mask為掩碼

void CAN_Set_Var(uchar address,uchar mask,uchar dat)

{

// CS=1;//片選

// delay(10);

CS=0;

delay(10);

SPISendByte(0x05);//位修改命令 CAN_BIT_MODIFY

//CANCTRL——CAN 控制寄存器(地址:XFh)

SPISendByte(address);//地址為0fH

SPISendByte(mask);//掩碼為E0H,修改CANCTRL的高三位

SPISendByte(dat);

CS=1;//片選

}

 

 

//初始化CAN通訊

void Init_Can(void)

{

/**復(fù)位MCP2515**/

SPIReset();

delay(20);

 

/**設(shè)置為配置模式**/

//CAN_Set_Var(0x0F,0XE0,0X80);

 

CAN_Write_SS(RXM0SIDH, 0x00);

CAN_Write_SS(RXM0SIDL,0x00);

CAN_Write_SS(RXF0SIDH,0x00);

CAN_Write_SS(RXF0SIDL,0x00);

 

/**設(shè)置通訊速率 晶振16M 速率125K**/

//CAN_Write_SS(0x2A,0X03);

//CAN_Write_SS(0x29,0XB9);

//CAN_Write_SS(0x28,0X04);

 

//設(shè)置波特率為125Kbps

//set CNF1,SJW=00,長(zhǎng)度為1TQ,BRP=49,TQ=[2*(BRP+1)]/Fsoc=2*50/8M=12.5us,16M

CAN_Write_SS(CNF1,CAN_125Kbps);//CNF1=0X03

//set CNF2,SAM=0,在采樣點(diǎn)對(duì)總線進(jìn)行一次采樣,PHSEG1=(2+1)TQ=3TQ,PRSEG=(0+1)TQ=1TQ

CAN_Write_SS(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);//3,1;6,2

//set CNF3,PHSEG2=(2+1)TQ=3TQ,同時(shí)當(dāng)CANCTRL.CLKEN=1時(shí)設(shè)定CLKOUT引腳為時(shí)間輸出使能位

CAN_Write_SS(CNF3,PHSEG2_3TQ);//3;7

 

//set TXB0,設(shè)置發(fā)送緩沖器0的標(biāo)識(shí)符和發(fā)送的數(shù)據(jù),以及發(fā)送的數(shù)據(jù)長(zhǎng)度

CAN_Write_SS(TXB0SIDH,0x06);//設(shè)置發(fā)送緩沖器0的標(biāo)準(zhǔn)標(biāo)識(shí)符,待修改***

CAN_Write_SS(TXB0SIDL,0x00);//用到標(biāo)準(zhǔn)標(biāo)識(shí)符

CAN_Write_SS(TXB0DLC,DLC_8);//設(shè)置發(fā)送數(shù)據(jù)的長(zhǎng)度為8個(gè)字節(jié),DLC_1

//CAN_Write_SS(TXB0D0,0x1E);//有待修改及確定是否使用

//CAN_Write_SS(TXB0D1,0x10);//有待修改及確定是否使用

/*set TXB1

CAN_Write_SS(TXB1SIDH,0x50);    //Set TXB0 SIDH

  CAN_Write_SS(TXB1SIDL,0x00);    //Set TXB0 SIDL

  CAN_Write_SS(TXB1DLC,0x40 | DLC_8);    //Set DLC = 3 bytes and RTR bit*/

 

 

  //設(shè)置接收緩沖器0的標(biāo)識(shí)符和初始化數(shù)據(jù)

  CAN_Write_SS(RXB0SIDH,0x00);//設(shè)置接收緩沖器0的標(biāo)準(zhǔn)標(biāo)識(shí)符,待修改***

  CAN_Write_SS(RXB0SIDL,0x60);//用到標(biāo)準(zhǔn)標(biāo)識(shí)符

  CAN_Write_SS(RXB0CTRL,0x60);//僅僅接收標(biāo)準(zhǔn)標(biāo)識(shí)符的有效信息,F(xiàn)IILHIT0=0表示RXB0 ,采用FILHIT0

  CAN_Write_SS(RXB0DLC,DLC_8);//設(shè)置接收數(shù)據(jù)的長(zhǎng)度為8個(gè)字節(jié)

 

  CAN_Write_SS(RXF0SIDH,0xFF);//初始化接收濾波器0,待修改***

  CAN_Write_SS(RXF0SIDL,0xE0);

  CAN_Write_SS(RXM0SIDH,0xFF);//初始化接收屏蔽器0,待修改***

  CAN_Write_SS(RXM0SIDL,0xE0);

 

  //設(shè)置接收緩沖器0中斷

  CAN_Write_SS(CANINTF,0x00);//清空中斷標(biāo)志位

  CAN_Write_SS(CANINTE,0x01);//接收緩沖器0滿中斷使能位

 

CAN_Write_SS(CANCTRL,REQOP_NORMAL | CLKOUT_ENABLED);//設(shè)置正常模式

 

  delay(10);

  dummy=CAN_Read_SS(CANSTAT);

if (OPMODE_NORMAL != (dummy && 0xE0))

  CAN_Write_SS(CANCTRL,REQOP_NORMAL | CLKOUT_ENABLED);//判斷進(jìn)入正常工作模式

  //CAN_Write_SS(CANCTRL,0x00);//選定正常工作模式

 

 

 

0x00 僅接收標(biāo)準(zhǔn)或擴(kuò)展標(biāo)識(shí)符

0x60 關(guān)閉接收所有數(shù)據(jù)

//CAN_Write_SS(0x60,0X60);

//

濾波

//CAN_Write_SS(0x00,0);

//CAN_Write_SS(0x01,0);

//CAN_Write_SS(0x02,0);

//CAN_Write_SS(0x03,0);

//

屏蔽

//CAN_Write_SS(0x20,0);

//CAN_Write_SS(0x21,0);

//CAN_Write_SS(0x22,0);

//

接收數(shù)據(jù)產(chǎn)生中斷

//CAN_Write_SS(0x2B,0X01);

//

環(huán)回模式

CAN_Set_Var(0x0F,0XE0,0X40);

工作模式

//CAN_Set_Var(0x0F,0XE0,0);

}

 

 

void CAN_writetxb0id(unsigned int txb0id)

{

CAN_Write_SS(TXB0SIDH,(txb0id>>3));//設(shè)置發(fā)送緩沖器0的標(biāo)準(zhǔn)標(biāo)識(shí)符,待修改***

CAN_Write_SS(TXB0SIDL,(0x00FF&(txb0id<<5)));//用到標(biāo)準(zhǔn)標(biāo)識(shí)符

}

 

 

 

 

//CAN發(fā)送數(shù)據(jù)程序 

void CAN_Send(unsigned char *CAN_TX_Buf)

{

unsigned char tempdata;

tempdata=CAN_Read_SS(CAN_RD_STATUS);

CAN_Write_SS(TXB0D0,CAN_TX_Buf[0]);

CAN_Write_SS(TXB0D1,CAN_TX_Buf[1]);

CAN_Write_SS(TXB0D2,CAN_TX_Buf[2]);

CAN_Write_SS(TXB0D3,CAN_TX_Buf[3]);

CAN_Write_SS(TXB0D4,CAN_TX_Buf[4]);

CAN_Write_SS(TXB0D5,CAN_TX_Buf[5]);

CAN_Write_SS(TXB0D6,CAN_TX_Buf[6]);

CAN_Write_SS(TXB0D7,CAN_TX_Buf[7]);

if(tempdata&0x04)//判斷TXREQ標(biāo)志位

{

delay(5);

CAN_Write_SS(TXB0CTRL,0);//清除TXREQ標(biāo)志位

while(CAN_Read_SS(CAN_RD_STATUS)&0x04);//等待TXREQ清零

}

CS=0;

SPISendByte(CAN_RTS_TXB0);//發(fā)送緩沖器0請(qǐng)求發(fā)送

CS=1;

}

頭文件1:

#ifndef __CAN_H__

#define __CAN_H__

// write your header here

 

#include

 

#define CAN_10Kbps 0x31

#define CAN_25Kbps 0x13

#define CAN_50Kbps 0x09

#define CAN_100Kbps 0x04

#define CAN_125Kbps 0x07

#define CAN_250Kbps 0x01

#define CAN_500Kbps 0x00

#endif


頭文件2:

#ifndef __2515_h__

#define __2515_h__

// write your header here

//#pragma nolist

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

 *   CAN MCP2510 C definitions file                                  *

 *********************************************************************

 *   Filename:       2515REGS.h                                      *

 *   Date:           06/17/03                                        *

 *   File Version:   1.00 (Beta)                                     *

 *********************************************************************

 *   Functions:                                                      *

 *               Header file                                         *

 *********************************************************************

 *   Revision History:                                               *

 *    06/17/03 Updated from MCP2510.inc which was for the 756 board  *

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

 

 

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

 *                   Register Definitions                          *

[1] [2] [3]
關(guān)鍵字:PIC16F887  SPI  CAN  傳輸  操作MCP2515 引用地址:PIC16F887 SPI CAN 傳輸,操作MCP2515

上一篇:PIC18F45K80 將RA0等配置為數(shù)字輸入I/O
下一篇:PIC知識(shí)點(diǎn)匯總

推薦閱讀

意法半導(dǎo)體的STSPIN830 和 STSPIN840單片電機(jī)驅(qū)動(dòng)器集成靈活多變的控制邏輯電路和低導(dǎo)通電阻RDS(ON)的功率開關(guān)管,有助于簡(jiǎn)化7V-45V工作電壓的中低功率電機(jī)的控制設(shè)計(jì),適用于工業(yè)制造、醫(yī)療技術(shù)和家電產(chǎn)品。 STSPIN830三相直流無刷電機(jī)驅(qū)動(dòng)器具有模式設(shè)置引腳,用戶通過設(shè)置該引腳可選用U、V和W脈寬調(diào)制(PWM)輸入信號(hào)來控制集成功率級(jí)的三個(gè)半橋,...
小米集團(tuán)2019年上半年業(yè)績(jī)出爐,不論是手機(jī)還是AIoT這兩大核心業(yè)務(wù),抑或是其他業(yè)務(wù)幾乎都呈現(xiàn)出積極增長(zhǎng),然而,該公司的股價(jià)走勢(shì)卻大相徑庭。小米集團(tuán)財(cái)報(bào)顯示,截至2019年6月底,小米集團(tuán)實(shí)現(xiàn)了營(yíng)業(yè)收入957.1億元,同比增長(zhǎng)20.2%,經(jīng)調(diào)整后凈利潤(rùn)為57.2億元,同比增長(zhǎng)49.8%。就在財(cái)報(bào)發(fā)布的第二日(8月21日)開盤后,小米的股價(jià)先從9.50港元/股迅速拉升...
原理圖:8個(gè)數(shù)碼管它的數(shù)據(jù)線并聯(lián)接到JP5, 位控制由8個(gè)PNP型三級(jí)管驅(qū)動(dòng)后由JP8引出。相關(guān)原理:數(shù)碼管是怎樣來顯示1,2,3,4呢?數(shù)碼管實(shí)際上是由7個(gè)發(fā)光管組成8字形構(gòu)成的,加上小數(shù)點(diǎn)就是8個(gè)。我們分別把他命名為A,B,C,D,E,F,G,H。搞懂了這個(gè)原理, 我們?nèi)绻@示一個(gè)數(shù)字2, 那么 A,B,G,E,D這5個(gè)段的發(fā)光管亮就可以了。也就是把B,E,H(小數(shù)點(diǎn))不...
據(jù)外媒MacRumors報(bào)道,爆料者Jon Prosser稱,蘋果目前正在測(cè)試全新的Face ID,可以讓用戶在戴著口罩或霧狀眼鏡時(shí)解鎖iPhone。Prosser解釋說,蘋果正在測(cè)試更先進(jìn)的Face ID硬件,其為iPhone 12設(shè)計(jì)了一個(gè)帶Face ID的保護(hù)殼,允許?iPhone?繞過其自帶的Face ID,轉(zhuǎn)而使用保護(hù)殼的Face ID。他表示,該保護(hù)套中的Face ID陣列比iPhone 12縮窄變小了不...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved