欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9019|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)CAN通信器件SJA1000驅(qū)動(dòng)代碼+頭文件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:75263 發(fā)表于 2015-3-25 00:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
//----------------------------------------------------------
// 51單片機(jī)實(shí)驗(yàn)板CAN通信器件SJA1000驅(qū)動(dòng)代碼
// ... ...
// 2016.11
// 推薦的測(cè)試方案以及對(duì)應(yīng)的測(cè)試代碼片段之一:
// 兩個(gè)實(shí)驗(yàn)板互相通信
// 跨接器連接:P32,P36,P37, P20,P21,P22, P25,P26,P27, P0全部
//            若連接距離較遠(yuǎn),雙方應(yīng)將 TR 跨接器連接起來(lái)
// void main(void)
// {
//     uchar i;
//     SJA1000_Init(10000, 0x0, 0xffffffff);
//     KS108_Init();
//     KS108_Disp_Str(0, 0, (uchar*)".....SJA1000 Test....");
//     KS108_Disp_Str(0, 2, (uchar*)"Frame_Info:");
//     KS108_Disp_Str(0, 3, (uchar*)"Frame_ID:  ");
//     KS108_Disp_Str(0, 4, (uchar*)"L                  Hi");
//     KS108_Disp_Str(0, 6, (uchar*)"Link:P0, P20~2, P25~7");
//     KS108_Disp_Str(0, 7, (uchar*)"P32,P36~7, TR,if need");
//     for(i=0; i<8; i++) SJA1000_Rec_Dat[i] = 2*i;
//     RX_Info = 0x88;
//     SJA1000_Transmit(RX_Info, 0x0, SJA1000_Rec_Dat);
//     while(1)
//     {
//         if(SJA1000_Received)
//         {
//             SJA1000_Received = 0;
//             KS108_Disp_Byte_Hex(11, 2, RX_Info);
//             KS108_Disp_Long_Hex(11, 3, SJA1000_Rec_ID);
//             SJA1000_Transmit(RX_Info, SJA1000_Rec_ID, SJA1000_Rec_Dat);
//             for(i=0; i<(RX_Info&0x0f); i++)
//                 KS108_Disp_Byte_Hex(i*2+2, 4, SJA1000_Rec_Dat[i]);
//         }
//     }
// }
// 推薦的進(jìn)一步的實(shí)驗(yàn):遠(yuǎn)程溫度測(cè)量傳輸/調(diào)溫控制.......
//----------------------------------------------------------
#include "..\include\AT89X52.H"
#include "..\include\global.h"
#include "..\INCLUDE\SJA1000.H"
sfr AUXR = 0x8e;//STC51的sfr,bit1=0/1<=>使能/禁能內(nèi)部擴(kuò)展RAM
#define  SJA1000RST  P2_5
//--------------------CAN寄存器地址-------------------------
#define CANB 0x00
pdata uchar CAN_MOD     _at_(CANB+0);           //模式寄存器
pdata uchar CAN_CMR     _at_(CANB+1);           //命令寄存器
pdata uchar CAN_SR      _at_(CANB+2);           //狀態(tài)寄存器
pdata uchar CAN_IR      _at_(CANB+3);           //中斷寄存器
pdata uchar CAN_IER     _at_(CANB+4);       //中斷使能寄存器
pdata uchar CAN_BRT0    _at_(CANB+6);      //總線定時(shí)0寄存器
pdata uchar CAN_BRT1    _at_(CANB+7);      //總線定時(shí)1寄存器
pdata uchar CAN_OCR     _at_(CANB+8);       //輸出控制寄存器
pdata uchar CAN_ALE     _at_(CANB+11);  //仲裁丟失捕捉寄存器
pdata uchar CAN_ECC     _at_(CANB+12);  //錯(cuò)誤代碼捕捉寄存器
pdata uchar CAN_EWLR    _at_(CANB+13);  //錯(cuò)誤報(bào)警限制寄存器
pdata uchar CAN_RXERR   _at_(CANB+14);      //接收錯(cuò)誤計(jì)數(shù)器
pdata uchar CAN_TXERR   _at_(CANB+15);      //發(fā)送錯(cuò)誤計(jì)數(shù)器
pdata uchar CAN_TXB[13] _at_(CANB+16);   //發(fā)送緩沖器,工作寫(xiě)
#define CAN_RXB CAN_TXB                  //接收緩沖器,工作讀
pdata uchar CAN_ACR[4]  _at_(CANB+16);//驗(yàn)收代碼寄存器0,復(fù)位讀/寫(xiě)
pdata uchar CAN_AMR[4]  _at_(CANB+20);//驗(yàn)收屏蔽寄存器0,復(fù)位讀/寫(xiě)
pdata uchar CAN_RMC     _at_(CANB+29);        //RX信息計(jì)數(shù)器
pdata uchar CAN_RBSA    _at_(CANB+30);            //RX緩沖器
pdata uchar CAN_CDR     _at_(CANB+31);          //時(shí)鐘分頻器
idata uchar RX_Info;
idata ulong SJA1000_Rec_ID;
idata uchar SJA1000_Rec_Dat[8];
bit SJA1000_Received;
//----------------------------------------------------------
// 函數(shù): SJA1000_CS(...)
// 功能: 設(shè)置SJA1000片選有效/無(wú)效,片選有效時(shí)使用外部擴(kuò)展RAM
//       當(dāng)片選無(wú)效時(shí)恢復(fù)使用內(nèi)部擴(kuò)展RAM
// 形參: v<===>0/1片選有效/無(wú)效
// 全局變量引用: 無(wú)
// 全局變量修改: 無(wú)
// 返回: 無(wú)
// 說(shuō)明: SJA1000以"51單片機(jī)外部擴(kuò)展RAM" 形式與51單片機(jī)實(shí)施連
//       接,采用頁(yè)尋址方式. SJA1000的片選信號(hào)由P2_0~P2_2經(jīng)過(guò)
//       3-8線譯碼器產(chǎn)生. P0端口以數(shù)據(jù)總線/地址總線形式使用,
//       從而P3_6~P3_7作為標(biāo)準(zhǔn)讀寫(xiě)信號(hào)引腳使用,但所有端口(包
//       括P0和P3端口)在與其它器件的連接關(guān)系中又可能以通用IO
//       方式使用,故需做特別處理. 此外實(shí)驗(yàn)板所使用的單片機(jī)內(nèi)
//       部含有寶貴的1024字節(jié)擴(kuò)展RAM, 通過(guò)單片機(jī)內(nèi)特殊功能寄
//       存器AUXR的設(shè)置, 可在"外部擴(kuò)展RAM(即SJA1000)"和"內(nèi)部
//       擴(kuò)展RAM"之間切換,當(dāng)SJA1000片選有效時(shí), 暫時(shí)關(guān)閉"內(nèi)部
//       擴(kuò)展RAM",當(dāng)SJA1000片選無(wú)效時(shí), 恢復(fù)使用"內(nèi)部擴(kuò)展RAM"
// 注意: 由于實(shí)驗(yàn)板的特殊結(jié)構(gòu), 對(duì)SJA1000的片選信號(hào)處理應(yīng)做特
//       殊處理,注意對(duì)51單片機(jī)讀寫(xiě)信號(hào)的處理.
//----------------------------------------------------------
void SJA1000_CS(uchar v)
{
    P2 |= 0x07;                             //P2<==XXXX X111
    if(v==0)
    {
        P3_6 = 1;      //在SJA1000片選有效之前保證寫(xiě)信號(hào)無(wú)效
        P3_7 = 1;      //在SJA1000片選有效之前保證讀信號(hào)無(wú)效
        P2 &= 0xfe;                         //P2<==XXXX X110
        AUXR = 0x02;        //使用外部擴(kuò)展RAM即本芯片SJA1000
    }
    else AUXR = 0x00;                      //使用內(nèi)部擴(kuò)展RAM
}
//----------------------------------------------------------
// 波特率與設(shè)置參數(shù)對(duì)照表
// SJA1000的主時(shí)鐘16MHz,28個(gè)標(biāo)準(zhǔn)波特率
// 按"最接近且小于等于"的原則規(guī)約到標(biāo)準(zhǔn)波特率上
//----------------------------------------------------------
ulong code baudrates[] =                  //28個(gè)最常用位速率
{
    1000000,800000, 500000, 400000, 320000, 250000, 200000,
    160000, 125000, 100000, 80000,  64000,  62500,  50000,
    40000,  32000,  31250,  25000,  20000,  16000,  15625,
    12800,  12500,  10000,  8000,   6400,   6250,   5000
};
uint code brconst[] =           //28個(gè)最常用位速率的時(shí)間參數(shù)
{
    0x4014, 0x4016, 0x401C, 0x802F, 0xC07F, 0x411C, 0x812F,
    0xC17F, 0x431C, 0x832F, 0xC37F, 0xC47F, 0x471C, 0x872F,
    0xC77F, 0xC97F, 0x4F1C, 0x8F2F, 0xCF7F, 0xD37F, 0x5F1C,
    0xD87F, 0x9F2F, 0xDF7F, 0xE77F, 0xF17F, 0xBF2F, 0xFF7F
};
//----------------------------------------------------------
// 函數(shù): SJA1000_Init(...)
// 功能: 對(duì)SJA1000實(shí)施加電初始化,設(shè)置通信波特率,設(shè)置驗(yàn)收碼和
//       驗(yàn)收屏蔽碼以及驗(yàn)收濾波器長(zhǎng)度,配置SJA1000接收中斷
// 形參: baudrate<==>通信波特率
//       ID<===>驗(yàn)收碼
//       IDMASK<===>驗(yàn)收屏蔽碼
// 全局變量引用: 無(wú)
// 全局變量修改: 無(wú)
// 返回: 無(wú)
// 說(shuō)明: 無(wú)
// 注意: 由于實(shí)驗(yàn)板的特殊結(jié)構(gòu), 對(duì)SJA1000的片選信號(hào)處理應(yīng)做特
//       殊處理
//----------------------------------------------------------
void SJA1000_Init(ulong baudrate, ulong ID, ulong IDMASK)
{
    uchar i=0xff;
    EA=0;
    IT0 = 1;
    EX0 = 1;
    SJA1000_CS(0);         //SJA1000片選有效,使用外部擴(kuò)展RAM
    SJA1000RST = 0;
    i=0xff;while(i--) ;
    SJA1000RST = 1;
    i=0xff;while(i--) ;
    i = 0;
    while((i != 27) && (baudrates[i] > baudrate)) i++;
    CAN_MOD = 0x01;                           //進(jìn)入復(fù)位狀態(tài)
    CAN_OCR = 0x1a;   //設(shè)置輸出控制寄存器:同相驅(qū)動(dòng),正常輸出
    CAN_BRT1 = brconst[i]&0xff;        //設(shè)置總線定時(shí)寄存器1
    CAN_BRT0 = ((brconst[i])>>8)&0xff; //設(shè)置總線定時(shí)寄存器0
    CAN_CDR = 0xc8;      //bit7=1:PeliCAN模式,關(guān)閉CLKOUT輸出
    for(i=0; i<4; i++) //設(shè)置驗(yàn)收代碼寄存器/驗(yàn)收屏蔽碼寄存器
    {
        CAN_ACR[i] = (ID>>24)     & 0xff;
        CAN_AMR[i] = (IDMASK>>24) & 0xff;
        ID     <<= 8;
        IDMASK <<= 8;
    }
    CAN_IER = 0x01;   //設(shè)置中斷使能寄存器,允許接收中斷
    i = CAN_MOD;
    while(i != 0x08)
    {
        CAN_MOD = 0x08;                       //單濾波器模式
        i = CAN_MOD;
    }
    EA = 1;
    SJA1000_CS(1);         //SJA1000片選無(wú)效,使用內(nèi)部擴(kuò)展RAM
}
//----------------------------------------------------------
// 函數(shù): SJA1000_Transmit(...)
// 功能: SJA1000幀發(fā)送函數(shù).可發(fā)送標(biāo)準(zhǔn)幀和擴(kuò)展幀兩種幀格式,每
//       種幀格式都支持?jǐn)?shù)據(jù)幀類型和遠(yuǎn)程幀類型
// 形參: ra_info<==>幀屬性字段(含幀格式/幀類型/數(shù)據(jù)長(zhǎng)度定義)
//                               ^bit7^ ^bit6^ ^bit3--bit0^
//       ID<===>被發(fā)送幀的幀ID.  標(biāo)準(zhǔn)幀的ID==ID的bit10--bit0
//                               擴(kuò)展幀的ID==ID的bit28--bit0
//       buf<==>指向被發(fā)送幀數(shù)據(jù)緩沖區(qū)的指針
// 全局變量引用: 無(wú)
// 全局變量修改: 無(wú)
// 返回: 0/1<===>發(fā)送失敗/成功
// 說(shuō)明: 為加快速度,采取以代碼空間換時(shí)間的策略, 盡量不用循環(huán)
// 注意: 由于實(shí)驗(yàn)板的特殊結(jié)構(gòu), 對(duì)SJA1000的片選信號(hào)處理應(yīng)做特
//       殊處理
//----------------------------------------------------------
uchar SJA1000_Transmit(uchar rx_info, ulong ID, uchar* buf)
{
    uchar i, j, len;
    SJA1000_CS(0);         //SJA1000片選有效,使用外部擴(kuò)展RAM
    rx_info &= 0xcf;       //高半字節(jié)僅僅保留幀格式/幀類型位
    if( (rx_info&0x0f) > 8 )
        rx_info = (rx_info & 0xf0) + 8;      //幀長(zhǎng)度最大為8
    len =rx_info & 0x0f;
    CAN_MOD = 8;
    j = CAN_SR;
    if((j & 0x04) == 0x04)     //若果CAN的當(dāng)前發(fā)送緩沖區(qū)可用
    {
        CAN_TXB[0] = rx_info;       //寫(xiě)幀格式/類型/長(zhǎng)度字段
        if(rx_info & 0x80)                    //如果是擴(kuò)展幀
        {
            CAN_TXB[1] = (ID>>21)&0xff;             //寫(xiě)幀ID
            CAN_TXB[2] = (ID>>13)&0xff;
            CAN_TXB[3] = (ID>> 5)&0xff;
            CAN_TXB[4] = (ID<< 3)&0xff;
            for(i=0; i<len; i++)                    //寫(xiě)數(shù)據(jù)
                CAN_TXB[i+5] = buf[i];
        }
        else                                  //如果是標(biāo)準(zhǔn)幀
        {
            CAN_TXB[1] = (ID>>3)&0xff;              //寫(xiě)幀ID
            CAN_TXB[2] = (ID<<5)&0xff;
            for(i=0; i<len; i++)                    //寫(xiě)數(shù)據(jù)
               CAN_TXB[i+3] = buf[i];
        }
        CAN_CMR = 0x01;                           //啟動(dòng)發(fā)送
        SJA1000_CS(1);         //SJA1000片選無(wú)效,使用內(nèi)部RAM
        return 1;                             //返回正常標(biāo)志
    }
    else                     //若果CAN的當(dāng)前發(fā)送緩沖區(qū)不可用
    {
        SJA1000_CS(1);         //SJA1000片選無(wú)效,使用內(nèi)部RAM
        return 0;                             //返回出錯(cuò)標(biāo)志
    }
}
//----------------------------------------------------------
// 函數(shù): int0_ISR()
// 功能: 外部中斷0的中斷服務(wù)函數(shù).外部中斷0由SJA1000產(chǎn)生,在初
//       始化SJA1000時(shí)打開(kāi)了接收中斷,考慮到SJA1000具有故障處
//       理/脫線自動(dòng)恢復(fù)的能力,故未打開(kāi)與錯(cuò)誤相關(guān)的中斷
// 形參: 無(wú)
// 全局變量引用: 無(wú)
// 全局變量修改: SJA1000_Received <==> "幀接收到"標(biāo)志
//               RX_Info          <==> 幀信息字段
//               SJA1000_Rec_ID   <==> 幀的ID
//               SJA1000_Rec_Dat[]<==> 幀的數(shù)據(jù)緩沖區(qū)
// 返回: 無(wú)
// 說(shuō)明: 為加快速度,采取以代碼空間換時(shí)間的策略, 盡量不用循環(huán)
// 注意: 由于實(shí)驗(yàn)板的特殊結(jié)構(gòu), 對(duì)SJA1000的片選信號(hào)處理應(yīng)做特
//       殊處理
//----------------------------------------------------------
void int0_ISR(void) interrupt 0          //外部中斷0,CAN中斷
{
    uchar temp, x, i;
    x = AUXR;                          //備份擴(kuò)展RAM占用模式
    SJA1000_CS(0);         //SJA1000片選有效,使用外部擴(kuò)展RAM
    temp = CAN_IR;                         //取CAN中斷寄存器
    temp = CAN_SR;                         //取CAN狀態(tài)寄存器
    if( (temp & 0x01) == 0x01 )             //如果是接收中斷
    {
     SJA1000_Received = 1;               //設(shè)置收到幀標(biāo)志
        RX_Info = CAN_RXB[0]; //取幀信息字段(格式/類型/長(zhǎng)度)
                 //下一行:取幀ID(擴(kuò)展幀或標(biāo)準(zhǔn)幀中共同的部分)
        SJA1000_Rec_ID = (CAN_RXB[1]<<8) + CAN_RXB[2];
        if(RX_Info & 0x80)                    //如果是擴(kuò)展幀
     {
            SJA1000_Rec_ID <<= 0x08;
            SJA1000_Rec_ID += CAN_RXB[3];
            SJA1000_Rec_ID <<= 0x08;
            SJA1000_Rec_ID += CAN_RXB[4];
            SJA1000_Rec_ID >>= 0x03;            //以上取幀ID
            
            for(i=0; i<(RX_Info&0x0f); i++) //以下取數(shù)據(jù)字段
                 SJA1000_Rec_Dat[i] = CAN_RXB[i+5];
     }
        else                                  //如果是標(biāo)準(zhǔn)幀
     {
            SJA1000_Rec_ID >>= 0x05;                //取幀ID
            for(i=0; i<(RX_Info&0x0f); i++) //以下取數(shù)據(jù)字段
                 SJA1000_Rec_Dat[i] = CAN_RXB[i+3];
     }
        CAN_CMR=0x0c;//清除數(shù)據(jù)溢出,釋放當(dāng)前幀所占FIFO緩沖區(qū)
    }
    SJA1000_CS(1);         //SJA1000片選無(wú)效,使用內(nèi)部擴(kuò)展RAM
    AUXR = x;                          //恢復(fù)擴(kuò)展RAM占用模式
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:75263 發(fā)表于 2015-3-25 00:07 | 只看該作者
SJA1000驅(qū)動(dòng)的頭文件:
//filie name:  SJA1000.h

#ifndef __SJA1000_H__
#define __SJA1000_H__

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

extern idata uchar RX_Info;
extern idata ulong SJA1000_Rec_ID;
extern idata uchar SJA1000_Rec_Dat[8];
extern bit SJA1000_Received;

void SJA1000_Init(ulong baudrate, ulong ID, ulong IDMASK);
uchar SJA1000_Transmit(uchar rx_info, ulong ID, uchar* buf);

#endif
回復(fù)

使用道具 舉報(bào)

板凳
ID:361044 發(fā)表于 2018-12-25 11:49 | 只看該作者
您好,問(wèn)一下,這個(gè)程序只在一個(gè)實(shí)驗(yàn)版上邊用,與周立功CANtest通信可以成功嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表