久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于樹莓派的can總線MCP2515驅動源程序(波形很好)
[打印本頁]
作者:
jhaa9793
時間:
2018-4-21 01:51
標題:
基于樹莓派的can總線MCP2515驅動源程序(波形很好)
工作項目用到了can總線,是在樹莓派的板子上運行的。用的can芯片是mcp2515。效果還不錯,波形很好。
0.png
(44.94 KB, 下載次數: 88)
下載附件
2018-4-21 02:04 上傳
單片機源程序如下:
#define CAN_10Kbps 0x31
#define CAN_25Kbps 0x13
#define CAN_50Kbps 0x09
#define CAN_100Kbps 0x04
#define CAN_125Kbps 0x03
#define CAN_250Kbps 0x01
#define CAN_500Kbps 0x00
#define SCK 14
#define SI 12
#define SO 13
#define CS 10 //CE0
#define INTIN 3
#define RST 4
#define TXREQ_M 0b11110111
#define CH 0
#include "MCP2515.h"
#include "bcm2835.h"
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#include <wiringPiSPI.h>
//采用bcm2835spi
void MCP2515_WriteByte(unsigned char addr,unsigned char dat)
{
unsigned char buf = CAN_WRITE;
unsigned char spiDat[] = {CAN_WRITE,addr,dat};
digitalWrite(CS,LOW); //置MCP2515的CS為低電平
bcm2835_spi_transfern(spiDat,3);
digitalWrite(CS,HIGH); //置MCP2515的CS為高電平
}
unsigned char MCP2515_ReadByte(unsigned char addr)
{
unsigned char rByte = 0;
unsigned char spiDat[] = {CAN_READ,addr,0xff};
digitalWrite(CS,LOW); //置MCP2515的CS為低電平
bcm2835_spi_transfern(spiDat,3);
digitalWrite(CS,HIGH); //置MCP2515的CS為高電平
rByte = spiDat[2];
return rByte; //返回讀到的一個字節數據
}
void MCP2515_Reset(void)
{
digitalWrite(RST,LOW);
delay(100);
digitalWrite(RST,HIGH);
delay(100);
}
//void IntHandle()
//{
// char temp=0;
// //中斷處理函數,MCU清除中斷FLAG,重新使能INTE,并且輸出RXB
// //digitalWrite(28,HIGH);
// printf("into the interrupt mode\nINT-IN is: %d\n",digitalRead(INTIN));
//// temp = MCP2515_ReadByte(CANINTF);
// //MCP2515_WriteByte(CANINTF,0x00);
// printf("into the interrupt mode\nINT-IN is: %d\n",digitalRead(INTIN));
// printf("RXB0SIDH : %02x\n",MCP2515_ReadByte(RXB0SIDH));
// printf("RXB0SIDL : %02x\n",MCP2515_ReadByte(RXB0SIDL));
// printf("RXB0D0 : %02x\n",MCP2515_ReadByte(RXB0D0));
// printf("RXB0D1 : %02x\n",MCP2515_ReadByte(RXB0D1));
// printf("RXB0D2 : %02x\n",MCP2515_ReadByte(RXB0D2));
// printf("RXB0D3 : %02x\n",MCP2515_ReadByte(RXB0D3));
// printf("RXB0D4 : %02x\n",MCP2515_ReadByte(RXB0D4));
// printf("RXB0D5 : %02x\n",MCP2515_ReadByte(RXB0D5));
// printf("RXB0D6 : %02x\n",MCP2515_ReadByte(RXB0D6));
// printf("RXB0D7 : %02x\n",MCP2515_ReadByte(RXB0D7));
// printf("\n\n");
// exit(1);
//}
void MCP2515_Init(void)
{
unsigned char temp=1;
MCP2515_Reset(); //發送復位指令軟件復位MCP2515
printf("Reset OK \n");
// delay(1); //Delay_Nms(1); //通過軟件延時約nms(不準確)
//設置波特率為125Kbps
//set CNF1,SJW=00,長度為1TQ,BRP=49,TQ=[2*(BRP+1)]/Fsoc=2*50/8M=12.5us
MCP2515_WriteByte(CNF1,CAN_125Kbps);
//set CNF2,SAM=0,在采樣點對總線進行一次采樣,PHSEG1=(2+1)TQ=3TQ,PRSEG=(0+1)TQ=1TQ
MCP2515_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);
//set CNF3,PHSEG2=(2+1)TQ=3TQ,同時當CANCTRL.CLKEN=1時設定CLKOUT引腳為時間輸出使能位
MCP2515_WriteByte(CNF3,PHSEG2_3TQ);
MCP2515_WriteByte(RXB0CTRL,0x20);//接收 過濾器信息
MCP2515_WriteByte(RXB0DLC,DLC_8);//設置接收數據的長度為8個字節
MCP2515_WriteByte(RXF0SIDH,0x12);//配置驗收濾波寄存器n標準標識符高位
MCP2515_WriteByte(RXF0SIDL,0x11);//配置驗收濾波寄存器n標準標識符低位
MCP2515_WriteByte(RXM0SIDH,0xFF);//配置驗收屏蔽寄存器n標準標識符高位
MCP2515_WriteByte(RXM0SIDL,0xE0);//配置驗收屏蔽寄存器n標準標識符低位
// MCP2515_WriteByte(RXB0SIDH,0x00);//清空接收緩沖器0的標準標識符高位
// MCP2515_WriteByte(RXB0SIDL,0x00);//清空接收緩沖器0的標準標識符低位
MCP2515_WriteByte(CANINTE,0x01);//配置CAN中斷使能寄存器的接收緩沖器0滿中斷使能,其它位禁止中斷
MCP2515_WriteByte(CANINTF,0x00);//清空CAN中斷標志寄存器的所有位(必須由MCU清空)
MCP2515_WriteByte(CANCTRL,REQOP_LOOPBACK|CLKOUT_ENABLED);//將MCP2515設置為環回模式,退出配置模式
temp=MCP2515_ReadByte(CANSTAT);//讀取CAN狀態寄存器的值
while(OPMODE_LOOPBACK!=(temp & 0xE0))//判斷MCP2515是否已經進入環回模式
{
//MCP2515_WriteByte(CANCTRL,REQOP_LOOPBACK|CLKOUT_ENABLED);//再次將MCP2515設置為環回模式,退出配置模式
temp=MCP2515_ReadByte(CANSTAT);
}
printf("MCP2515 loopback mode OK\n");
}
void LOOPTest()
{
printf("LoopTest begin\n");
MCP2515_WriteByte(TXB0DLC,DLC_8);//設置發送數據長度為8
MCP2515_WriteByte(TXB0SIDH,0x12);//發送緩沖器0標準標識符高位
MCP2515_WriteByte(TXB0SIDL,0x11);//發送緩沖器0標準標識符低位
MCP2515_WriteByte(TXB0CTRL,0x02); //高優先級
MCP2515_WriteByte(TXB0D0,0x83); //數據
MCP2515_WriteByte(TXB0D1,0x83);
MCP2515_WriteByte(TXB0D2,0x83);
MCP2515_WriteByte(TXB0D3,0x87);
MCP2515_WriteByte(TXB0D4,0x87);
MCP2515_WriteByte(TXB0D5,0x87);
MCP2515_WriteByte(TXB0D6,0x84);
MCP2515_WriteByte(TXB0D7,0x84);
printf("TXB0D0 : %02x\n",MCP2515_ReadByte(TXB0D0));
printf("TXB0D1 : %02x\n",MCP2515_ReadByte(TXB0D1));
printf("TXB0D2 : %02x\n",MCP2515_ReadByte(TXB0D2));
printf("TXB0D3 : %02x\n",MCP2515_ReadByte(TXB0D3));
printf("TXB0D4 : %02x\n",MCP2515_ReadByte(TXB0D4));
printf("TXB0D5 : %02x\n",MCP2515_ReadByte(TXB0D5));
printf("TXB0D6 : %02x\n",MCP2515_ReadByte(TXB0D6));
printf("TXB0D7 : %02x\n",MCP2515_ReadByte(TXB0D7));
printf("RXB0SIDH : %02x\n",MCP2515_ReadByte(RXB0SIDH));
printf("RXB0SIDL : %02x\n",MCP2515_ReadByte(RXB0SIDL));
printf("RXB0D0 : %02x\n",MCP2515_ReadByte(RXB0D0));
printf("RXB0D1 : %02x\n",MCP2515_ReadByte(RXB0D1));
printf("RXB0D2 : %02x\n",MCP2515_ReadByte(RXB0D2));
printf("RXB0D3 : %02x\n",MCP2515_ReadByte(RXB0D3));
printf("RXB0D4 : %02x\n",MCP2515_ReadByte(RXB0D4));
printf("RXB0D5 : %02x\n",MCP2515_ReadByte(RXB0D5));
printf("RXB0D6 : %02x\n",MCP2515_ReadByte(RXB0D6));
printf("RXB0D7 : %02x\n",MCP2515_ReadByte(RXB0D7));
printf("\n\n");
char temp = 0;
temp = MCP2515_ReadByte(TXB0CTRL);
MCP2515_WriteByte(TXB0CTRL,(temp| (~TXREQ_M ))); //請求發送
int cnt = 0;
while(MCP2515_ReadByte(TXB0CTRL)&(0b00001000) != 0x00)
{
cnt++;
if(cnt>=100000)
{
printf("trasmission failed\n");
exit(1);
}
}
delay(100);
printf("RXB0SIDH : %02x\n",MCP2515_ReadByte(RXB0SIDH));
printf("RXB0SIDL : %02x\n",MCP2515_ReadByte(RXB0SIDL));
printf("RXB0D0 : %02x\n",MCP2515_ReadByte(RXB0D0));
printf("RXB0D1 : %02x\n",MCP2515_ReadByte(RXB0D1));
printf("RXB0D2 : %02x\n",MCP2515_ReadByte(RXB0D2));
printf("RXB0D3 : %02x\n",MCP2515_ReadByte(RXB0D3));
printf("RXB0D4 : %02x\n",MCP2515_ReadByte(RXB0D4));
printf("RXB0D5 : %02x\n",MCP2515_ReadByte(RXB0D5));
printf("RXB0D6 : %02x\n",MCP2515_ReadByte(RXB0D6));
printf("RXB0D7 : %02x\n",MCP2515_ReadByte(RXB0D7));
printf("\n\n");
}
void bcm2835_SPISetup(void)
{
if (!bcm2835_init())
{
printf("bcm2835_init failed. Are you running as root??\n");
exit(1);
}
if (!bcm2835_spi_begin())
{
printf("bcm2835_spi_begin failed. Are you running as root??\n");
exit(1);
}
bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); // The default
bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); // The default
bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536); // The default
bcm2835_spi_chipSelect(BCM2835_SPI_CS0); // The default
bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); // the default
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
MCP2515.rar
(25.34 KB, 下載次數: 116)
2018-4-21 01:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
kenchen
時間:
2018-4-24 22:50
感謝樓主熱心分享
作者:
jiawei_zhong
時間:
2018-5-14 16:40
感謝樓主熱心分享!!!
作者:
jiawei_zhong
時間:
2018-5-14 16:59
非常感謝樓主分享,我找了好多地方,都不是專門針對樹莓派。自己寫因為不熟悉又太花時間了
作者:
北緯30度
時間:
2018-7-30 13:00
挺好的 參考參考
作者:
lalalala256
時間:
2018-8-13 11:43
謝謝分享,
作者:
ZTG_5930
時間:
2018-9-17 16:30
樓主好,很感謝你的分享。但是我想問一下那個printf()串口打印是MCP2515和CAN收發器之間的CAN串口,還是單純的MCU的串口。謝謝
作者:
ZTG_5930
時間:
2018-9-17 16:31
請回復一下,初學者2677957815
作者:
hongyeluzhu
時間:
2018-12-11 16:43
謝謝分享
作者:
askloser
時間:
2019-1-14 13:12
謝謝分享, 學習一下
作者:
xiguaxiao
時間:
2019-1-20 10:38
多謝樓主分享
作者:
snni00
時間:
2019-5-7 14:15
正好需要擴一路CAN,感謝分享
作者:
捍衛者
時間:
2019-11-18 13:57
感謝樓主熱心分享
作者:
contactdeshine
時間:
2020-5-19 20:39
非常感謝,熱心分享
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲一区二区三区
|
亚洲 中文 欧美 日韩 在线观看
|
日韩高清中文字幕
|
国产区在线观看
|
久久一热
|
成人a视频片观看免费
|
日韩视频―中文字幕
|
综合中文字幕
|
9久久精品
|
国产99热精品
|
欧美精品在线视频
|
精品久久久久久亚洲精品
|
国产精品一区在线播放
|
精品一级电影
|
中国xxxx性xxxx产国
|
国产伊人精品
|
偷牌自拍
|
美女人人操
|
亚洲国产精品一区在线观看
|
日日操视频
|
色综合天天网
|
成年人的视频免费观看
|
91天堂
|
亚洲欧美精品国产一级在线
|
人人干人人舔
|
四虎在线观看
|
日韩精品一区二区三区高清免费
|
国产91在线 | 中日
|
国产高清一区二区三区
|
国产精品日女人
|
欧美性受xxxx白人性爽
|
国产精品电影在线观看
|
欧美日韩在线观看一区二区三区
|
亚洲女人天堂成人av在线
|
日韩精品在线免费观看
|
国产亚洲www
|
日韩成人免费视频
|
日韩亚洲欧美综合
|
久久精品国产久精国产
|
一区二区三区四区av
|
久久久久久国产精品久久
|