<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > CAN-bus接口控制實(shí)驗(yàn)

          CAN-bus接口控制實(shí)驗(yàn)

          作者: 時(shí)間:2016-12-14 來(lái)源:網(wǎng)絡(luò) 收藏
          一.實(shí)驗(yàn)?zāi)康?p>通過(guò)調(diào)用CAN 程序庫(kù)SJA1000_PELI.LIB 的基本函數(shù),實(shí)現(xiàn)實(shí)驗(yàn)板上CAN 節(jié)點(diǎn)
          的初始化以及CAN 節(jié)點(diǎn)的自發(fā)自收測(cè)試。
          二. 驗(yàn)設(shè)備及器件
          IBM PC 機(jī) 一臺(tái)
          DP-51PROC 單片機(jī)綜合仿真實(shí)驗(yàn)儀 一臺(tái)
          三. 實(shí)驗(yàn)內(nèi)容
          編寫一段程序,調(diào)用SJA1000_PELI.LIB 中的函數(shù),實(shí)現(xiàn)CAN 節(jié)點(diǎn)的初始化,
          能夠進(jìn)行數(shù)據(jù)的自發(fā)自收,并能在LED 上顯示相關(guān)的信息。
          四. 實(shí)驗(yàn)要求
          學(xué)會(huì)對(duì)CAN 節(jié)點(diǎn)的基本操作,理解實(shí)現(xiàn)CAN 通信的基本流程。
          五. 實(shí)驗(yàn)步驟
          1. 將CAN-bus PARK 插在到A6 區(qū)中,用導(dǎo)線連接A6 區(qū)的P1_IO2 到A2 區(qū)的P10,
          連A6 區(qū)的P1_CS 到和A2 區(qū)的A15。
          2. 使用導(dǎo)線把A2 區(qū)的P16 和P17 分別于D5 區(qū)的SCL 和SDA 相連。使用導(dǎo)線把
          D5 區(qū)的RST_L 與VCC 相連
          3. 如果用戶采用中斷方式,將A6 區(qū)的P1_INT 接到A2 區(qū)的INT0 或INT1 另外改
          相應(yīng)的程序即可。
          4. 利用SJA1000_PELI 庫(kù)編寫CAN 節(jié)點(diǎn)的初始化和自發(fā)自收程序。
          5. 利用ZLG7290,將CAN 節(jié)點(diǎn)自發(fā)自收數(shù)據(jù)的成功與否顯示出來(lái)。
          六. 實(shí)驗(yàn)預(yù)習(xí)要求
          1. 閱讀關(guān)于CAN 和CAN 相關(guān)器件的基本介紹,具備CAN 和CAN 相關(guān)器件的基本知
          識(shí)。
          2. 閱讀配套光盤中的《SJA1000_PELI 庫(kù)說(shuō)明及其使用》文檔,了解在如何在程序中
          應(yīng)用SJA1000_PELI 庫(kù)。
          七. 實(shí)驗(yàn)參考程序
          #include
          #include "VIIC_C51.h" //I2C程序庫(kù)頭文件
          #include "Sja1000_peli.h" //CAN程序庫(kù)頭文件
          #define uchar unsigned char
          #define ZLG7290 0x70
          sbit RESET_PIN=P1^0;
          uchar Display_Buffer[5]={0x0d,0x15,0x15,0x10}; //顯示GOOD

          本文引用地址:http://www.ex-cimer.com/article/201612/329642.htm

          uchar CAN_Baudrate_Filter_Buffer[9]={14,0,0,0,0,0xff,0xff,0xff,0xff};
          //存放設(shè)置波特率和濾波器的數(shù)據(jù)
          uchar Send_CAN_Info_ID[5]={0x88,0x00,0x00,0x00,0x00};
          //存放信息幀的數(shù)據(jù),符合CAN2.0B
          uchar Send_Data_For_Self[8]={ 0x01,0x02,0x03,0x04,
          0x05,0x06,0x07,0x08};
          //存放數(shù)據(jù)幀的數(shù)據(jù)
          uchar ScanNum[1];
          /*------------------------------------------------------------------------------------
          ** 函數(shù)原型: void Delay_ms(uchar j)
          ** 功能描述: 該函數(shù)用于不精確的延時(shí)。在12M,6CLK下,大約延時(shí)j*1ms
          ** 參數(shù)說(shuō)明: 0-255
          ** 返回值: 無(wú)
          /*----------------------------------------------------------------------------------*/
          void Delay_ms(uchar j)
          {
          uchar k,l;
          for(l=0;l<=j;l++)
          {
          for(k=0;k<=250;k++)
          {
          ;
          }
          }
          }
          /*------------------------------------------------------------------------------------
          ** 函數(shù)原型: unsigned char ZLG7290_SendCmd( unsigned char Data1,
          unsigned char Data2)
          ** 功能描述: 發(fā)送命令(對(duì)子地址7、8)
          ** 參數(shù)說(shuō)明: DATA1: 命令1
          ** DATA2: 命令2
          ** 返回值: 0 失敗
          ** 1 成功
          /*----------------------------------------------------------------------------------*/
          unsigned char ZLG7290_SendCmd( unsigned char Data1,
          unsigned char Data2)
          {
          unsigned char Data[2];
          Data[0]=Data1;
          Data[1]=Data2;
          ISendStr(ZLG7290,0x07,Data,2);
          Delay_ms(10);
          return 1;
          }
          /*------------------------------------------------------------------------------------
          ** 函數(shù)原型: void ZLG7290_SendDisBuf( unsigned char *disp_buf,
          unsigned char num)
          ** 功能描述: 向顯示緩沖區(qū)發(fā)送數(shù)據(jù)
          ** 參數(shù)說(shuō)明: *disp_buf 要發(fā)送數(shù)據(jù)的起始地址
          ** num 發(fā)送個(gè)數(shù)

          ** 返回值: 無(wú)
          /*----------------------------------------------------------------------------------*/
          void ZLG7290_SendDisBuf(unsigned char *disp_buf,unsigned char num)
          {
          unsigned char i;
          for(i=0;i{
          ZLG7290_SendCmd(0x60+i,*disp_buf);
          disp_buf++;
          }
          }
          /*------------------------------------------------------------------------------------
          ** 函數(shù)原型: void SJA1000_Config_Self(void)
          ** 功能描述: 對(duì)SJA1000的在自發(fā)自收模式下的初始化配置
          ** 參數(shù)說(shuō)明: 無(wú)
          ** 返回值: 無(wú)
          /*----------------------------------------------------------------------------------*/
          void SJA1000_Config_Self(void)
          {
          SJAEntryResetMode(); //進(jìn)入復(fù)位模式
          WriteSJAReg(REG_CAN_CDR,0xc8); //選擇PeliCAN模式
          SetBitMask(REG_CAN_MOD,AFM_BIT); //選擇單濾波模式
          SetBitMask(REG_CAN_MOD,STM_BIT); //選擇自檢測(cè)模式
          WriteSJARegBlock(16,&CAN_Baudrate_Filter_Buffer[1],8);
          //設(shè)置驗(yàn)收代碼/屏蔽寄存器
          WriteSJAReg(REG_CAN_OCR,0x1a); //設(shè)置輸出管腳
          SJASetBaudrateStandard(CAN_Baudrate_Filter_Buffer[0]);
          //設(shè)置總線定時(shí)器,確定波特率
          SJAQuitResetMode(); //退出復(fù)位模式
          }
          /*------------------------------------------------------------------------------------
          ** 函數(shù)原型: unsigned char Send_Sja1000_Self(void)
          ** 功能描述: 把數(shù)據(jù)傳送到SJA1000的接收緩沖區(qū),并進(jìn)行自發(fā)自收的測(cè)試
          ** 參數(shù)說(shuō)明: 無(wú)
          ** 返回值: 0 失敗
          ** 1 成功
          /*----------------------------------------------------------------------------------*/
          unsigned char Send_Sja1000_Self(void)
          {
          uchar i;
          SJA1000_Config_Self();
          WriteSJAReg(REG_CAN_IER,0x03); //使能接收發(fā)送中斷標(biāo)志位
          Delay_ms(100);
          for(i=0;i<2;i++)
          {
          if((ReadSJAReg(REG_CAN_SR)&0x0c)==0x0c)//判斷是否可以發(fā)送
          {
          WriteSJARegBlock(16,Send_CAN_Info_ID,5);
          //擴(kuò)展幀,向發(fā)送緩沖區(qū)寫入5個(gè)數(shù)據(jù)
          WriteSJARegBlock(21,Send_Data_For_Self,8);
          //擴(kuò)展幀,向發(fā)送緩沖區(qū)寫入8個(gè)數(shù)據(jù)

          SetBitMask(REG_CAN_CMR,SRR_BIT); //使能自發(fā)送請(qǐng)求標(biāo)志位
          return(1); //返回發(fā)送成功標(biāo)志
          }
          else
          {
          Delay_ms(200); //延時(shí)200ms
          }
          return(0); //返回發(fā)送失敗標(biāo)志
          }
          }
          /*------------------------------------------------------------------------------------
          ** 函數(shù)原型: void main(void)
          ** 功能描述: 主函數(shù)
          ** 參數(shù)說(shuō)明: 無(wú)
          ** 返回值: 無(wú)
          /*----------------------------------------------------------------------------------*/
          void main()
          {
          RESET_PIN=0;
          //將SJA1000的復(fù)位線與P1.0相連接
          Delay_ms(1);
          RESET_PIN=1;
          //控制P1.0來(lái)實(shí)現(xiàn)SJA1000的復(fù)位
          SJA_CS_Point=&CAN_SJA_BaseAdr; //確定SJA1000的基址
          ScanNum[0]=0; //不顯示
          Display_Buffer[0]=0x1f;
          ZLG7290_SendDisBuf(Display_Buffer,0);
          ISendStr(ZLG7290,0x0d,ScanNum,1);
          Delay_ms(100);
          if(Send_Sja1000_Self())
          {
          Delay_ms(200);
          if((ReadSJAReg(REG_CAN_IR)==0x03)) //查詢接收/發(fā)送中斷位
          {
          WriteSJAReg(REG_CAN_CMR,4); //釋放接收緩沖區(qū)
          ScanNum[0]=3; //掃描4位
          Display_Buffer[0]=0x0d; //顯示Good
          Display_Buffer[1]=0x15;
          Display_Buffer[2]=0x15;
          Display_Buffer[3]=0x10;
          ISendStr(ZLG7290,0x0d,ScanNum,1);
          ZLG7290_SendDisBuf(Display_Buffer,4);
          }
          else
          {
          ScanNum[0]=4; //掃描5位
          Display_Buffer[0]=0x18; //顯示Error
          Display_Buffer[1]=0x15;
          Display_Buffer[2]=0x18;
          Display_Buffer[3]=0x18;
          Display_Buffer[4]=0x0e;
          ISendStr(ZLG7290,0x0d,ScanNum,1);

          }
          else
          {
          ScanNum[0]=4; //掃描5位
          Display_Buffer[0]=0x18; //顯示Error
          Display_Buffer[1]=0x15;
          Display_Buffer[2]=0x18;
          Display_Buffer[3]=0x18;
          Display_Buffer[4]=0x0e;
          ISendStr(ZLG7290,0x0d,ScanNum,1);
          ZLG7290_SendDisBuf(Display_Buffer,5);
          }
          while(1)
          {
          ; //死循環(huán)
          }
          }
          在本示范程序中,采用了查詢中斷標(biāo)志位的方式來(lái)判斷自發(fā)自收數(shù)據(jù)是否成功。用戶也
          可以將SJA1000的INT管腳連接到MCU的外部中斷管腳上,并使能相應(yīng)的中斷位,在程序
          中編寫中斷服務(wù)程序來(lái)實(shí)現(xiàn)同樣的功能。采用中斷的方式,可以提高系統(tǒng)的實(shí)時(shí)性。特別是
          在接收數(shù)據(jù)的時(shí)候,采用中斷方式可以在效率和實(shí)時(shí)性上比采用查詢方式得到很大的提高。
          接收數(shù)據(jù)采用中斷方式的程序流程圖如下所示。

          圖3.42 CAN 節(jié)點(diǎn)自發(fā)自收基本流程圖
          九. 實(shí)驗(yàn)思考題
          (1) 請(qǐng)用戶思考一下,如何編寫CAN 總線數(shù)據(jù)的正常發(fā)送程序。
          (2) 請(qǐng)用戶再思考一下,如何編寫CAN 總線數(shù)據(jù)的接收程序。



          關(guān)鍵詞: CANbus接口控

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();