色另类_婷婷激情四月_亚洲精品无码不卡在线播放he_欧美第七页_精品国产综合区久久久久99_青娱乐极品盛宴在线

產品分類

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

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

PA,FF通訊芯片

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

現場總線通信控制器 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

推薦產品

更多
主站蜘蛛池模板: 久久成人国产 | 欧美日韩中文在线 | 欧洲怡红院| 亚洲精品天堂 | 波多野结衣办公室在线 | 91视频精选 | 91在线一区二区三区 | 亚洲播播 | 色中色资源| 国产美女视频网站 | 日本在线播放不卡一区二区三区 | 精品国产一区二区三区免费 | 欧美日韩在线一区二区 | 成人免费视频网址 | 精品欧美在线 | 日本高清视频免费在线观看 | 免费a级毛片在线播放 | 久久噜噜噜精品国产亚洲综合 | 亚洲一区二区视频 | 欧洲怡红院 | 欧美日韩中文字幕一区二区高清 | 久草视频在线资源 | 天堂在线91 | 91精品国产91久久综合 | 看毛片免费| 亚洲欧洲一区二区 | 亚洲AV成人天堂影院 | 婷婷色九月综合激情丁香 | 杏美月av| 欧美区在线 | 91久久久久久久一区二区 | 日韩一区在线视频 | 日本中文字幕在线观看 | 日日爽天天操 | 91免费在线 | 一区二区三区在线播放 | 亚洲 偷拍 色播 | 国产欧美精品一区二区三区四区 | 天天射天天干天天插 | 欧美午夜精品久久久久免费视 | 日本在线高清视频 |