当前位置: 首页 > 传感测量产品 > 工业传感器 > 其他传感器 > 色度传感器

类型分类:
科普知识
数据分类:
色度传感器

PA,FF通讯芯片

发布日期:2022-04-18 点击率:80

现场总线通信控制器 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

推荐产品

更多