带RTC的I2C总线铁电存储器FM31256
图2 I2C总线通信基本格式
FM31256严格按I2C总线的时序和数据格式操作,其访问操作过程可描述为如下步骤: 启动-从机地址-应答-目标地址-应答-(启动-从机地址-应答)-数据(单或多字节)-应答-停止(注: 从机地址中包含了读写命令;括号中的步骤为当前地址读和连续地址读命令所特有的)。这里对应答信号作些说明。应答脉冲发生在第8个数据位传送之后。在这个状态下,发送方须释放SDA让接收方驱动;当接收方发出低电平时,表示正常应答,当发出高电平时,表示无应答。不应答有两种情况: 一是数据传送出错,无应答使发送方终止当前操作,以便重新寻址;二是接收方有意不作应答,以结束当前操作。
在对SFR操作时,首先发送的命令字节为"1 1 0 1 X A1 A0 R/W",目标地址为单字节范围(00H~18H)。FM31256的32 KB存储单元地址为0000H~7FFFH,对其进行操作时,首先发送的命令字节为"1 0 1 0 X A1 A0 R/W",目标地址长度为双字节,即RAM区的寻址能力为0~65 535。FM31系列存储器具有内部地址锁存和自动累加功能,当对连续地址区进行读/写操作时,只须发送存储区首地址。
3 FM31256在电磁铸轧电源控制中的应用
将FM31256应用在电磁铸轧电源控制装置当中,实现主控系统的看门狗复位、给定参数、实时时钟及故障记录保存的功能。
作为一种解决微处理器因干扰而死机问题的有效方法,看门狗的作用是必不可少的。针对控制对象,需要对A、B、C三相控制装置进行调节,包括设定正弦波的频率和幅值、反馈系数、PID参数、过流延时、开放延时和关断延时等;将这些给定的参数及时写入铁电存储器FM31256的存储单元中,使之掉电后仍能保存。当系统发生故障时,例如控制装置中晶闸管周围温度超过额定温度,装置就会发出报警信号,并将发生故障的准确时间、实际温度值记录在FM31256的存储单元中,以便系统查询;同时,FM31256的事件计数器加1计数。同样,利用串行标识区可锁定的功能,可将电磁铸轧电源控制装置的序列号写入其中,非常安全可靠。
3.1 硬件原理
电磁铸轧电源控制装置应用FM31256的硬件接口电路如图3所示。从图3中可以看出,系统以超低功耗MSP430系列芯片MSP430F149作为控制器;FM31256作为参数存储单元,与处理器之间采用I2C总线进行通信。由于MSP430F149没有I2C总线接口,所以任取2个I/O口模拟。实时时钟在VDD掉电以后自动切换到后备电源VBAK。
图3 FM31256与MSP430F149的硬件接口电路
32.768 kHz晶振等效于6 pF电容。若将SFR的01H单元对应的OSCEN位设为0,同时置00H单元的CAL位为1,使CAL引脚输出512 Hz的脉冲信号,则可检测晶振工作是否正常,因为512 Hz是晶振频率的64分频。制PCB板时须注意: X1和X2晶振引脚均为高阻引脚,两引脚之间的距离须小于5 mm;即使信号位于板内层,也不允许信号线靠近X1和X2引脚。在晶振引脚周围使用接地保护环,内部或板反面使用接地保护敷铜。
3.2 存储区访问程序设计
对FM31256存储器访问操作过程中,微处理器处于主机地位,器件始终处于从机地位。根据上述对FM31256的分析,可以把所有的通信过程归纳为3种类型: ① 单脉冲,如Start、Stop、Ack、Nack;② 字节发送,如从机地址、目标地址和数据传送;③ 字节接收,如读操作中的数据传送。因此只要把这些操作以子程序的形式编写好,所有的通信操作就可通过调用这些子程序来完成。这里以MSP430F149微处理器的嵌入式C语言编写。设微处理器端口P6.6为数据线(SDA);P5.4为时钟线(SCL)。
限于篇幅,本文不作详细介绍,只给出模拟I2C总线及字节写入、读出的部分C语言程序:
#defineRTC_SDABIT6
#defineRTC_SCLBIT4
void FM31256_Start(void) {/*FM31256启动程序*/
P6OUT |=RTC_SDA;// SDA=1
P5OUT |=RTC_SCL;// SCL=1
delay(IIC_DELAY);
P6OUT &=~ RTC_SDA;// SDA=0
delay(IIC_DELAY);
P5OUT &=~ RTC_SCL;// SCL=0}
void FM31256_Stop( void ) {/*FM31256停止程序*/
P6OUT &=~ RTC_SDA;// SDA=0
delay(IIC_DELAY);
P5OUT |=RTC_SCL;// SCL=1
delay(IIC_DELAY);
P6OUT |=RTC_SDA;// SDA=1
delay(IIC_DELAY);}
void FM31256_Send_Ack( void ) {/*FM31256应答程序*/
P5OUT &=~ RTC_SCL;// SCL=0
P6OUT &=~ RTC_SDA;// SDA=0
P5OUT |=RTC_SCL;// SCL=1
delay(IIC_DELAY);
P5OUT &=~ RTC_SCL;// SCL=0}
void FM31256_Send_noAck( void ) {/*FM31256不应答程序*/
P5OUT |=RTC_SCL;// SCL=1
delay(IIC_DELAY);
P5OUT &=~ RTC_SCL;// SCL=0}
说明:SCL线是高电平时,SDA线从高电平向低电平切换,表示起始条件;当SCL是高电平时,SDA线由低电平向高电平切换,表示停止条件。相关的确认时钟脉冲由主机产生,在确认的时钟脉冲器件发送方释放SDA(高电平),在此期间接收方须将SDA拉低。
void FM31256_transfByte_to_IIC( unsigned char tran_byte ) {/* CPU字节发送程序*/
unsigned char i , current_bit =0x80;
P5OUT &=~ RTC_SCL;
delay(IIC_DELAY);
for( i=0; i <=7; i++ ) {
if ( tran_byte & current_bit )
P6OUT |= RTC_SDA;
else
P6OUT &=~ RTC_SDA;
current_bit >>=1;
delay(IIC_DELAY);
P5OUT |=RTC_SCL;//SCL=1
delay(IIC_DELAY);
P5OUT &=~ RTC_SCL;//SCL=0
delay(IIC_DELAY);
}
}
unsigned char FM31256_receByte_from_IIC( void ){/*CPU字节接收程序*/
unsigned char mvalue, i, rece_data =0;
P6DIR &=~ RTC_SDA;//设置为输入方向
P5OUT &=~ RTC_SCL; //SCL=0
delay(IIC_DELAY);
for(i=0;i<8;i++) {
rece_data = rece_data<<1;
P5OUT |=RTC_SCL;//SCL=1
delay(IIC_DELAY);
mvalue = P6IN & RTC_SDA;//当前位的值
if( mvalue )//接收位为高
rece_data = rece_data | 0x01;
else//接收位为低
rece_data = rece_data & 0xFE;
P5OUT &=~ RTC_SCL;//SCL=0
delay(IIC_DELAY);
}
P6DIR |=RTC_SDA;//P6.6输出
return(rece_data);//返回收到的字节
}
说明:发送到SDA线上的每个字节须为8位。tran_byte为CPU要发送的字节,CPU读入的数据存储在rece_data中。对FM31256存储器可以直接对当前地址进行"读"操作,也可以连续"读/写"多个字节而无须逐一指定地址。依据上述一般步骤,对存储器的访问操作可归纳为3种基本操作: ① 设置当前操作目标地址; ② 写入数据; ③ 读出数据。
访问存储器操作有多种,如内存"写"、当前地址或顺序连续"读"和随机地址"读"操作。在控制程序中,需要向FM31256内存中写入并读出给定参数、故障信息等数据。内存读/写的方法如下:
内存写操作,首先由CPU发送从机地址,然后是内存16位地址,主机通过设置从机地址字节的最低位为0声明一个写操作;接收应答信号后,CPU向FM31256发送数据的每个字节,之后器件又产生应答信号,任何数量的连续字节可以被写入,以停止信号结束传输。有两种类型的读操作:当前地址读操作和随机地址读操作。读操作同样先由CPU发送从机地址,主机通过设置从机地址字节的最低位为1声明一个读操作。当要进行随机读操作时,还要在读取数据之前,发送16位内存地址之后读取任意个字节,每个字节后应跟随应答信号,以停止信号结束传输。
在电磁铸轧电源控制装置的主控程序中,还将调用时钟刷新函数Flash_time()、时钟写入函数Write_time()、寄存器写入函数Register_write()和寄存器读出函数Register_read()。
启动RTC和WatchDog的流程图如图4所示。
- STM32F之RTC(07-05)
- FRDM-KL25Z平台RTC模块应用举例(06-08)
- I2C总线原理及应用实例 (01-18)
- I2C总线在多机通信中的应用(01-17)
- ZLG7290在智能仪表面板接口设计中的应用(03-10)
- I2C总线多主通信研究与软件设计(07-05)