<rt id="m4md3"></rt>
  • <bdo id="m4md3"><meter id="m4md3"></meter></bdo>
  • <label id="m4md3"></label>
      <center id="m4md3"><optgroup id="m4md3"></optgroup></center>
      產品分類

      當前位置: 首頁 > 傳感測量產品 > 工業傳感器 > 其他傳感器 > 色度傳感器

      類型分類:
      科普知識
      數據分類:
      色度傳感器

      PA,FF通訊芯片

      發布日期:2022-04-18 點擊率:136

      現場總線通信控制器 FBC0409
      驅動程序開發手冊

      周侗
      中國科學院沈陽自動化研究所
      2007 年10 月
      現場總線通信控制器FBC0409 驅動程序開發手冊
      中國科學院沈陽自動化研究所
      1、概述
      本文給出了現場總線通信控制器 FBC0409 驅動程序開發的相關說明及示例程序,包括
      FBC0409 芯片初始化、發送和接收操作、定時器使用等內容。
      FBC0409 性能說明、內部寄存器定義參見FBC0409 數據手冊。
      2、FBC0409 初始化
      FBC0409 初始化過程需要對命令寄存器、中斷屏蔽寄存器、DMA 接收數據區地址寄存
      器等進行設置。
      FBC0409 中命令寄存器1(FB_CMD1)中的ARME 位(位0)是地址識別設置位,寫0
      表示關閉地址識別功能,寫1 則打開地址識別功能。需要說明的是,FBC0409 只支持FF H1
      協議的地址識別功能,在開發PROFIBUS PA 時,必須關閉地址識別功能。
      FBC0409 初始化過程中,需要通過命令寄存器0(FB_CMD0)中的TFCE(位2)來選擇
      報文發送過程中是由用戶還是硬件進行報文校驗和的生成工作,報文校驗和有2 個字節。如
      TFCE=0,表示在發送數據時需要由用戶自己在報文尾部添加2 個字節的校驗碼;TFCE=1
      則表示硬件自動在報文尾部添加2 個字節的校驗碼。
      FBC0409 在接收數據時,會自動進行校驗檢查,然后通過狀態寄存器0(STATUS0)中
      的位2(FCSF_STAT)來顯示校驗結果。不管報文校驗結果對或錯,FBC0406 都會將報文上傳
      給用戶,但用戶程序通過FCSF_STAT 會知道校驗的結果。
      正常情況下,用戶程序將計算出來的報文長度再減去 2 個即得到報文真正長度。
      用戶在測試硬件時,可以采用內回環方式進行。
      示例代碼:
      #define FBC0409_RAM 0x111111
      #define FBC0409_REG 0x222222
      unsigned short TD_ADDRESS , RXADDRESS;
      void fbc0409_init(void)
      {
      int i;
      TXADDRESS=0x0000; //發送緩沖區首址變量
      RXADDRESS=0x0200; //接受緩沖區首址變量
      //內環回測試

      *(FB0409_REG+0x01) = 0x2d; //FB_CMD1。0010 1101/半雙工/preamble=2
      *(FB0409_REG+0x02) = 0x16; //FB_ CMD2。0001 0110/DMA 收發
      *(FB0409_REG+0x03) = 0x27; //FB_CMD2。0010 0111/CPU 時鐘/
      *(FB0409_REG+0x26) = 0x00; //FB_CMD3。0000 0000/CLK_DIV=0
      *(FB0409_REG+0x04) = 0xff; //寫中斷狀態寄存器,用于清除所有中斷
      *(FB0409_REG+0x05) = 0xff;
      *(FB0409_REG+0x06) = 0xff;
      *(FB0409_REG+0x07) = 0xff;
      *(FB0409_REG+0x08) = 0x26; // ISR0_MSK。幀前定界碼/接收空閑/發送空閑
      *(FB0409_REG+0x09) = 0x00; // ISR1_MSK。關閉地址識別中斷
      *(FB0409_REG+0x0A) = 0x02; // ISR2_MSK。打開1/32ms 比較中斷
      *(FB0409_REG+0x0B) = 0x00; // ISR3_MSK。關閉錯誤中斷
      *(FB0409_REG+0x12) = RXADDRESS>>8; //接收緩沖區首址,RCV_BUFPTR_HI
      *(FB0409_REG+0x13) = RXADDRESS&0xFF; //接收緩沖區首址,RCV_BUFFPTR_LO
      fbc0409_set32TimerCmp(32000); //此函數在定時器設置一節中給出
      }
      3、FBC0409 數據發送操作
      FBC0409 支持兩種向現場總線發送數據的方式,即CPU 方式和DMA 方式。CPU 方式
      是報文逐個字節發送,DMA 方式是成組數據發送,后者的效率要比前者高,在此推薦DMA
      方式發送數據。
      用戶程序在發送數據時,需要考慮以何種方式生成 2 個字節的校驗和。
      下面僅給出了以 DMA 方式發送數據的示例。
      示例代碼:
      void fbc0409_send(unsigned char *paucData, unsigned char ucLength)
      {
      int i;
      *(FB0409_REG+0x0E) = TXADDRESS>>8; //發送緩沖區首址,TRM_BUFFPTR_HI
      *(FB0409_REG+0x0F) = TXADDRESS&0xFF; //發送緩沖區首址,TRM_BUFFPTR_LO
      *(FB0409_REG+0x0C) = ucLength>>8; //發送數據字節數,TRM_DATACNT_HI
      現場總線通信控制器FBC0409 驅動程序開發手冊
      中國科學院沈陽自動化研究所
      *(FB0409_REG+0x0D) = ucLength&0xff; //發送數據字節數,TRM_DATACNT_LO
      //復制數據到發送緩沖區中
      memcpy(FB0409_RAM+TXADDRESS, paucData, ucLength);
      *(FB0409_REG+0x00) = 0xdd; //向發送寄存器(TRM_REG)寄存器寫入任意值,啟動發送
      }
      4、FBC0409 數據接收操作
      FBC0409 使用一個中斷向量,通過判斷中斷主寄存器和中斷狀態寄存器0~3 中的狀態
      位來確認已經發生的中斷事件。為了防止在中斷處理過程中又有新的中斷產生,在中斷處理
      完成后需要再一次判斷是否有新的中斷發生。
      FBC0409 接收數據的過程中,DMA 接收數據地址指針是變化的,每收到一個字節,其
      值就加1,永遠指向存放下一個字節的空間。用戶程序在判斷接收到幀頭時,需要記錄下
      DMA 接收數據地址指針的當前值uiframeHead,在判斷接收到幀尾時,需要記錄下DMA
      接收數據地址指針的當前值uiframeEnd,然后用uiframeEnd 減去uiframeHead,然后再減
      去2 就得到報文的長度,這是因為正常情況下FBC0409 接收到的數據中包括2 個字節的校
      驗碼。
      用戶程序判斷幀尾的方式有兩種,即接收空閑中斷和幀后定界碼中斷,可以通過設置中
      斷狀態寄存器0(ISR0)來確定。這里我們推薦采用接收空閑中斷方式來判斷幀尾。
      用戶程序在接收數據時,可以根據狀態寄存器 0(STATUS0)中的位2(FCSF_STAT)來
      了解報文的校驗結果
      這里給出了 DMA 方式接收數據的示例。
      示例代碼:
      unsigned short uiframeHead, uiframeEnd;
      unsigned short uiRcvLen;
      unsigned short aucRcvBuffer[256];

      void fbc0409_int(void)
      {
      unsigned char ucISR_master, ucTemp;
      ucISR_master = *(FB0409_REG+0x03); //保存中斷主寄存器值,操作過程中寄存器內容被修改
      do
      {
      if(ucISR_master) // ucISR_master 值不為0 表示有中斷事件發生
      {
      現場總線通信控制器FBC0409 驅動程序開發手冊
      中國科學院沈陽自動化研究所
      if(ucISR_master & 0x04) //定時器中斷
      {
      ucTemp = *(FB0409_REG+0x06); //讀出并回寫中斷狀態寄存器2 來清定時
      //器中斷
      *(FB0409_REG+0x06) = ucTemp;
      if (ucTemp & 0x02) // 1/32 ms 比較計數器中斷
      {

      }
      }
      if(ucISR_master & 0x01 == 0x01) //通信中斷
      {
      ucTemp = *(FB0409_REG+0x04); //讀出并回寫中斷狀態寄存器1 來清通信
      //中斷
      *(FB0409_REG+ 0x04) = ucTemp;
      if(ucTemp & 0x20) //幀前定界碼中斷,表示接收到幀頭
      {
      uiframeHead = (*(FB0409_REG+0x12))*256+*(FB0409_REG+0x13);
      uiRcvLen = 0;
      }
      if(ucTemp & 0x04) //接收空閑中斷,表示接收到幀尾
      {
      uiframeEnd = (*(FB0409_REG+0x12))*256+*(FB0409_REG+0x13);
      uiRcvLen = (uiframeEnd - uiframeHead -2); //計算報文長度
      //示例中設定最大報文長度為256。
      if(uiRcvLen <= 256)
      {
      memcpy(aucRcvBuffer, FB0409_RAM+uiframeHead, uiRcvLen);
      }
      //重新設定接收緩沖區首址
      *(FB0409_REG+0x12) = RXADDRESS>>8;
      *(FB0409_REG+0x13) = RXADDRESS&0xFF;
      }
      if(ucTemp & 0x02) //發送空閑中斷
      {
      }
      }
      現場總線通信控制器FBC0409 驅動程序開發手冊
      中國科學院沈陽自動化研究所
      }
      ucISR_master = *(FB0409_REG+0x03);
      }while(ucISR_master);
      }
      5、FBC0409 定時器應用
      FBC0409 提供了三個定時器:1ms、1/32ms 和octet,可以充分滿足用戶的需求。每種
      定時器都有溢出操作和比較操作,當每種定時器計數值達到0xFFFF 時,即產生溢出中斷;
      當定時器計數值達到相應比較寄存器的值時,即產生比較中斷,具體是否產生中斷需要看相
      應中斷屏蔽器是的設置。
      需要說明的是,1/32ms 定時器是每個計數的單位是1/32ms ;1ms 定時器中每個計數
      的單位是1ms;octet 定時器中每個計數的單位是8*1/32ms,即1/4ms。
      FBC0409 只要一上電,其各個計數寄存器即開始工作,其計數值時刻在變化。
      用戶程序定時時,需要先讀出相應計數值寄存器的當前值 StartTime,加上定時長度
      Interval,得到EndTime,將EndTime 寫入相應的比較寄存器中,當計數值寄存器的值達到
      EndTime 時,即產生相應的定時溢出中斷。參見中斷狀態寄存器2(ISR2)說明。
      用戶程序在讀取計數值時,需要先鎖存計數器,向TIMER_LATCH(0x1F)寄存器中寫入
      任意值即可實現內部定時器鎖存操作,然后再讀計數器值。
      示例代碼:

      void fbc0409_set32TimerCmp(unsigned short uInterval)
      {
      unsigned short uStartTime = 0,uEndTime = 0;
      unsigned char ucReg = 0;
      //向TIMER_LATCH 寄存器中寫入任意值,以鎖存計數器
      *(FB0409_REG+0x1F) = 0x01;
      //讀1/32ms 計數器中當前計數值
      uStartTime = *(FB0409_REG+0x20)*256 +*(FB0409_REG+0x21);
      //用當前計數值加上定時長度即得計數器結束時的值
      uEndTime = uStartTime + uInterval;
      //將計數器結束時的值寫入1/32ms 比較計數器中,
      *(FB0409_REG+0x20) = (uEndTime >> 8) & 0xff; //高字節
      *(FB0409_REG+0x21) = uEndTime & 0xff; //低字節
      現場總線通信控制器FBC0409 驅動程序開發手冊
      中國科學院沈陽自

      下一篇: PLC、DCS、FCS三大控

      上一篇: 索爾維全系列Solef?PV

      推薦產品

      更多
      主站蜘蛛池模板: 色久综合网精品一区二区| 国产精品天干天干在线综合| 狠狠做深爱婷婷综合一区| 色久悠悠婷婷综合在线亚洲 | 国产成+人+综合+亚洲专| 精品综合久久久久久98| 色综合久久综合中文小说| 国产综合色在线视频区| 久久综合偷偷噜噜噜色| 亚洲综合AV在线在线播放 | 久久婷婷五月综合97色| 女人和拘做受全程看视频日本综合a一区二区视频 | 亚洲人成伊人成综合网久久| 色噜噜狠狠色综合欧洲| 久久香蕉综合色一综合色88| 亚洲av日韩综合一区久热| 久久综合综合久久狠狠狠97色88| 91综合久久婷婷久久| 日韩综合无码一区二区| 色欲综合久久躁天天躁| 色综合无码AV网站| 丁香婷婷亚洲六月综合色| 久久久久久久综合| 久久综合九色综合97手机观看| 亚洲精品第一国产综合精品99 | 亚洲综合色婷婷七月丁香| 国产成人综合日韩精品无码| 开心婷婷五月激情综合社区| 色综合色综合色综合色综合网 | 亚洲色偷偷偷鲁综合| 狠狠色婷婷狠狠狠亚洲综合 | 久久综合九色综合97免费下载| 色综合天天综合网看在线影院| 久久综合AV免费观看| 天天狠狠色综合图片区| 精品综合久久久久久蜜月| 免费国产综合视频在线看| 亚洲精品国产综合久久一线| 狠狠88综合久久久久综合网| 狠狠色丁香久久综合五月| 色综合67194|