接口:I2C总线
数据:seconds,minutes,hours,day,date,month,year
格式:12 or 24-hour format(AM/PM),时间和日期采用BCD格式
寄存器
地址 |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
功能 |
范围 |
|||||
00H |
0 |
10秒 |
秒 |
秒 |
00—59 |
|
|||||||||
01H |
0 |
10分 |
分 |
分 |
00-59 |
|
|||||||||
02H |
0 |
12/ |
/PM |
10小时 |
小时 |
小时 |
1-12+AM/PM 00-23 |
|
|||||||
10小时 |
|
||||||||||||||
03H |
0 |
0 |
0 |
0 |
0 |
星期 |
星期 |
1-7 |
|
||||||
04H |
0 |
0 |
10天 |
天 |
天 |
0-31 |
|
||||||||
05H |
世纪 |
0 |
0 |
10月 |
月 |
月/世纪 |
01-12+CENTURY |
|
|||||||
06H |
10年 |
年 |
年 |
00-99 |
|
||||||||||
07H |
A1M1 |
10秒 |
秒 |
报警1秒 |
00-59 |
|
|||||||||
08H |
A1M2 |
10分 |
分 |
报警1分 |
00-59 |
|
|||||||||
09H |
A1M3 |
12/ |
/PM |
10小时 |
小时 |
报警1小时 |
1-12+AM/PM00-23 |
|
|||||||
10小时 |
|
||||||||||||||
0AH |
A1M4 |
DY/DT |
10天 |
星期,天 |
报警1星期,报警1天 |
1-7,1-31 |
|
||||||||
0BH |
A2M2 |
10分 |
分 |
报警2分 |
00-59 |
|
|||||||||
0CH |
A2M3 |
12/ |
/PM |
10小时 |
小时 |
报警2小时 |
1-12+AM/PM00-23 |
|
|||||||
10小时 |
|
||||||||||||||
0DH |
A2M4 |
DY/ |
10天 |
星期,天 |
报警2星期,报警2天 |
1-7,1-31 |
|
||||||||
0EH |
0 |
BBSQI |
RS2 |
RS1 |
INTCN |
A2IE |
A1IE |
控制 |
|
|
|||||
0FH |
OSF |
0 |
0 |
0 |
0 |
0 |
A2F |
A1F |
状态 |
|
|
||||
10H |
TCS3 |
TCS2 |
TCS1 |
TCS0 |
DS1 |
DS0 |
ROUT1 |
ROUT0 |
涓流充电器 |
|
|
说明:
☆ 时间寄存器的B6选择12或24小时模式,1=12小时模式,0=24小时模式;
☆ 12小时模式时,AM/PM位=1是PM,0=AM;
☆ 24小时模式时,小时寄存器的B5是10小时位(20到23时);
☆ 当12/24模式改变时,所有的小时值(包括报警)都必须重新输入;
☆ 当从99年到00年时,就触发月寄存器的B7(世纪);
☆ 星期寄存器在午夜递增,和星期对应的值是可以自定义的,但必须是顺序的(如1对应星期天,则2就对应星期一,等等);
☆ 控制寄存器的INTCN位使能报警;
☆ 控制寄存器0EH
EOSC:晶振使能0=启动晶振,1=停止晶振,缺省=0;
BBSQI:1=当没有VCC使用VBACKUP时输出方波或中断,0=当VCC低于VPF时SQW/INT脚变成高阻态。缺省是0;
RS2:RS1:控制方波输出频率,如下表所示,缺省是11;
SQW/INT输出
INTCN |
RS2 |
RS1 |
SQW/ 输出 |
A2IE |
A1IE |
0 |
0 |
0 |
1Hz |
X |
X |
0 |
0 |
1 |
4.096kHz |
X |
X |
0 |
1 |
0 |
8.192kHz |
X |
X |
0 |
1 |
1 |
32.768kHz |
X |
X |
1 |
X |
X |
0 |
1 |
|
1 |
X |
X |
1 |
0 |
|
1 |
X |
X |
+ |
1 |
1 |
INTCN:1=时间寄存器和报警1或报警2之间匹配时激活SQW/INT脚(假设报警使能),0=SQW/INT输出方波。缺省是0;
A2IE:1=允许报警2标志(A2F)激活SQW/INT,0=A2F不能激活中断,缺省是0;
A1IE:1=允许报警1标志(A1F)激活SQW/INT,0=A1F不能激活中断,缺省是0;
☆ 状态寄存器
OSF:晶振停止标志,1=晶振停止了或者是停止过,开机后应软件清零;
A2F:1=表示时间和报警2寄存器匹配,可以软件清零;
A1F:1=表示时间和报警1寄存器匹配,可以软件清零;
☆ 涓流充电器寄存器
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
功能 |
X |
X |
X |
X |
0 |
0 |
X |
X |
禁止 |
X |
X |
X |
X |
1 |
1 |
X |
X |
禁止 |
X |
X |
X |
X |
X |
X |
0 |
0 |
禁止 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
没有二极管,250Ω电阻 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
一个二极管,250Ω电阻 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
没有二极管,2kΩ电阻 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
一个二极管,2kΩ电阻 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
没有二极管,4kΩ电阻 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
一个二极管,4kΩ电阻 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
上电初始化值 |
二极管和电阻根据电池的最大充电电流决定,如假设VCC=3.3V,假设选择了二极管和R2(2KΩ),则:
IMAX=(3.3V-二极管压降)/R2≈(3.3V-0.7V)/2KΩ≈1.3mA
I2C总线:
SDA和SCL是开漏open-drain输出;
在传输数据时,当时钟为高时,数据线必须保持稳定,如果发生改变,就认为是控制信号;
总线状态:
☆ 总线不忙:数据和时钟线都是高电平;
☆ 开始数据传输:时钟为高电平,数据线有一个下降沿(从高到低);
☆ 停止数据传输:时钟为高电平,数据线有一个上升沿(从低到高);
☆ 数据有效:在开始条件后,在时钟为高电平期间,数据线一直是稳定的,就表示数据有效,数据线必须在时钟为低电平时改变,每个数据位一个时钟脉冲,每个数据从开始条件开始,由停止条件终止;开始和停止之间所传输的数据字节数不限。传输按字节响应,接收者在第九位返回一个应答。
☆ 应答:每个接收设备在接收到每个字节后必须产生一个应答。主设备必须为应答送出一个时钟脉冲;
在应答时,应答设备在应答时钟脉冲期间拉低SDA线,这样在应答时钟脉冲中,SDA线一直是稳定的低电平;
主设备通知从设备数据传输结束:最后一个字节后主设备不应答;
☆ 数据传输时先送高位;
DS1339作为从设备(写模式):
主设备先送地址,地址由1101000(7位)+R/ (方向位,0=写)组成,在确认地址后,DS1339会给出一个应答;然后主设备可以送寄存器地址给DS1339,同样DS1339会给一个应答;然后主设备还可以送出0到几个字节数据,DS1339会对每个字节应答,地址指针每接收到一个字节就递增一次。
DS1339作为从设备(读模式):
第一个字节和上面一样,但方向位=1;在应答第一个字节后,DS1339就开始送出寄存器指针所指向的寄存器数据,如果在读之前没有写寄存器指针,这寄存器指针就使用用来的值;每送出一个字节,寄存器指针就递增,DS1339用“不应答”结束一次读。
上面两个过程如下图所示:
数据写
|
从地址 |
R/W |
|
寄存器地址 |
|
数据 |
|
|
数据 |
|
|
S |
1101000 |
0 |
A |
XXXXXXXX |
A |
XXXXXXXX |
A |
… |
XXXXXXXX |
A |
P |
S—开始,A—应答,P—停止; □—主到从,■—从到主; |
数据读
|
从地址 |
R/W |
|
数据 |
|
数据 |
|
|
数据 |
|
|
S |
1101000 |
1 |
A |
XXXXXXXX |
A |
XXXXXXXX |
A |
… |
XXXXXXXX |
|
P |
S—开始,A—应答,P—停止; □—主到从,■—从到主; |
数据读(写指针,然后读)
|
|
从地址 |
R/W |
|
寄存器地址 |
|
|
从地址 |
|
R/W |
|
||||||||
|
S |
1101000 |
0 |
A |
XXXXXXXX |
A |
S |
1101000 |
1 |
A |
→ |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
数据 |
|
数据 |
|
|
数据 |
|
|
|
|
|
||||||||
→ |
XXXXXX |
A |
XXXXXX |
A |
… |
XXXXXX |
|
P |
|
|
|
||||||||
S—开始,A—应答,P—停止; □—主到从,■—从到主; |
PIC18F2525 I2C
寄存器
SSPSTAT(状态寄存器),SSPCON1和SSPCON2(控制寄存器);
SPI模式
寄存器
SSPCON1/SSPSTAT/SSPBUF/SSPSR(不能直接访问)
接收时,SSPSR和SSPBUF构成双缓冲,数据先到SSPSR,然后送到SSPBUF;
发送时,数据同时写到SSPBUF和SSPSR;
SSPSTAT(SPI模式)
B7 |
|
|
|
|
|
|
B0 |
SMP |
CKE |
D/ |
P |
S |
R/ |
UA |
BF |
SMP:采样
SPI主模式:
1=在数据输出结尾采样输入数据;
0=在数据输出中间采样输入数据;
SPI从模式:
必须=0;
CKE:SPI时钟选择位
1=当时钟状态从激活变到空闲时传输;
0=当时钟状态从空闲变到激活时传输;
时钟状态的极性由CKP位设置。
D/A:地址/数据位
只用在I2C模式中。
P:停止位
只用在I2C模式中。
S:开始位
只用在I2C模式中。
R/W:读/写信息位
只用在I2C模式中。
UA:更新地址位
只用在I2C模式中。
BF:缓冲区满状态位(接收模式)
1=接收完成,SSPBUF满;
0=接收没有完成,SSPBUF空;
SSPCON1:
B7 |
|
|
|
|
|
|
B0 |
WCOL |
SSPOV |
SSPEN |
CKP |
SSPM3 |
SSPM2 |
SSPM1 |
SSPM0 |
WCOL:写冲突检测位(发送模式)
1=写SSPBUF时仍在发送前一个数据(必须软件清除);
0=没有冲突;
SSPOV:接收溢出
SPI从模式:
1=接收到一个新数据,但SSPBUF仍保存了前一个数据,这时,SSPSR中的数据就会丢失;
0=没有溢出;
SSPEN:同步串行端口使能
1=使能串行端口,把SCK,SDO,SDI和SS配置为串行端口脚;
0=禁止串行端口;
使能时,这些脚必须正确配置输入或输出。
CKP:时钟极性选择
1=时钟的空闲状态是高电平;
0=时钟的空闲状态时低电平;
SSPM3:SSPM0:同步串行端口模式选择
0101=SPI从模式,时钟=SCK脚,SS脚控制禁止,SS可以用作I/O脚;
0100=SPI从模式,时钟=SCK,SS脚控制允许;
0011=SPI主模式,时钟=TMR2输出/2;
0010=SPI主模式,时钟=FOSC/64;
0001=SPI主模式,时钟=FOSC/16;
0000=SPI主模式,时钟=FOSC/4;
操作
初始化操作:
4 主(SCK是时钟输出)或从(SCK是时钟输入)模式
4 时钟极性
4 数据输入采样时间
4 时钟边沿(在SCK的上升或下降沿输出数据)
4 时钟速率(只对主模式)
4 从选择模式(只对从模式)
注意:送出数据时高位在先。
I2C模式
寄存器
SSPSTAT(I2C模式)
B7 |
|
|
|
|
|
|
B0 |
SMP |
CKE |
D/ |
P |
S |
R/ |
UA |
BF |
SMP:转换速率控制
1=标准速度模式,转换速率控制禁止(100kHz和1MHz);
0=高速模式,允许转换速率控制(400kHz);
CKE:SMBus选择
1=使能SMBus特定输入;
0=禁止SMBus特定输入;
D/A:数据/地址
主模式:保留
从模式:
1=表示最后一个发送或接收的字节是数据;
0=表示最后发送或接收到的字节是地址;
P:停止位
1=表示最后检测到一个停止位;
0=最后没有检测到停止位;
注:本位在复位和SSPEN=0时清零;
S:开始
1=表示最后检测到了一个开始位;
0=最后没有检测到开始位;
注:本位在复位和SSPEN=0时清零;
R/W:读/写信息位
在从模式:
1=读;
0=写;
注:本位保存了最后一次地址匹配时的R/W信息,本位只在地址匹配到下一个开始位、停止位或无应答位之间有效。
在主模式:
1=正在发送;
0=没在发送;
注:本位和SEN、RSEN、PEN、RCEN或ACKEN相或可以指示MSSP是否激活;
UA:更新递增(只用在10位从模式)
1=表示用户需要更新SSPADD寄存器中的地址;
0=地址不需要更新;
BF:缓冲区满状态位
在发送模式:
1=SSPBUF满;
0=SSPBUF空;
在接收模式:
1=SSPBUF满(不包括ACK和停止位);
0=SSPBUF空(不包括ACK和停止位);
SSPCON1:(I2C模式)
B7 |
|
|
|
|
|
|
B0 |
WCOL |
SSPOV |
SSPEN |
CKP |
SSPM3 |
SSPM2 |
SSPM1 |
SSPM0 |
WCOL:写冲突检测位(发送模式)
在主发送模式:
1=当I2C不具备开始发送条件时写SSPBUF寄存器(必须软件清零);
0=没有冲突;
在从发送模式:
1=还在发送前一个数据时写SSPBUF寄存器(必须软件清零);
0=没有冲突;
接收模式:无关位;
SSPOV:接收溢出指示
在接收模式:
1=SSPBUF寄存器前一个数据没有读走,又接收到新数据(必须软件清零);
0=没有溢出;
在发送模式:无关位;
SSPEN:同步串口使能
1=使能串口,SDA和SCL配置为串口脚;
0=禁止串口,这些脚配置为I/O脚;
注:当使能时,必须正确配置SDA和SCL的方向;
CKP:SCK释放控制
在从模式:
1=释放时钟;
0=保持时钟为低电平(时钟扩展),以保证数据建立时间;
在主模式:未用;
SSPM3:SSPM0:同步串口模式选择
1111=I2C从模式,10位地址,开始和停止位中断使能;
1110=I2C从模式,7位递增,开始和停止位中断使能;
1011=I2C软件控制主模式(从空闲);
1000=I2C主模式,时钟=FOSC/(4*(SSPADD+1))
0111=I2C从模式,10位地址;
0110=I2C从模式,7位地址;
SSPCON2:(I2C模式)
B7 |
|
|
|
|
|
|
B0 |
GCEN |
ACKSTAT |
ACKDT |
ACKEN |
RCEN |
PEN |
RSEN |
SEN |
GCEN:通呼使能(只对从模式)
1=当SSPSR接收到一个通呼地址(0000H)时中断使能;
0=禁止通呼地址;
ACKSTAT:应答状态(只对主发送模式)
1=没有从从设备接收到应答;
0=从从设备接收到了应答;
ACKDT:应答数据(只对主接收模式)
1=没有应答;
0=应答;
ACKEN:应答序列使能(只对主接收模式)
1=初始化SDA和SCL脚的应答序列,并发送ACKDT数据位,硬件自动清零;
0=应答序列无效;
RCEN:接收使能(只对主模式)
1=使能I2C的接收模式;
0=接收无效;
PEN:停止条件使能(只对主模式)
1=初始化SDA和SCL脚的停止条件,硬件自动清零;
0=停止条件无效;
RSEN:重复开始条件使能(只对主模式)
1=初始化SDA和SCL脚的重复开始条件,硬件自动清零;
0=重复开始条件无效;
SEN:开始条件使能/扩展使能
在主模式:
1=初始化SDA和SCL脚的开始条件,硬件自动清零;
0=开始条件无效;
在从模式:
1=从发送和接收都使能时钟扩展(扩展使能);
0=禁止时钟扩展;
操作
I2C可以选择如下模式:
4 I2C主模式时钟
4 I2C从模式(7位地址)
4 I2C从模式(10位地址)
4 I2C从模式(7位地址),开始和停止位中断使能
4 I2C从模式(10位地址),开始和停止位中断使能
4 I2C软件控制主模式,从模式无效
主模式
一个典型的主模式发送过程可以如下:
1.用户设置SEN=1,产生一个开始条件;
2.硬件SSPIF=1(需要软件清零),MSSP在开始其他操作前需要等待所需的启动时间;
3.从地址加载到SSPBUF;
4.地址从SDA脚送出;
5.MSSP模块从从设备读入ACK位,使SSPCON2寄存器的ACKSTAT=0;
6.MSSP模块在第九个时钟周期产生一个中断,使SSPIF=1(需要软件清零);
7.8位数据加载到SSPBUF;
8.数据从SDA送出;
9.MSSP模块从从设备接收ACK信号并写到SSPCON2寄存器的ACKSTAT位;
10.MSSP模块在第九个时钟周期产生一个中断,使SSPIF=1;
11.用户设置PEN=1,产生一个停止条件;
12.一旦停止条件完成就会产生一个中断。
一个典型的主模式接收过程可以如下:
1.用户设置SEN=1,产生一个开始条件;
2.硬件SSPIF=1(需要软件清零),MSSP在开始其他操作前需要等待所需的启动时间;
3.从地址加载到SSPBUF;
4.地址从SDA脚送出;
5.MSSP模块从从设备读入ACK位,使SSPCON2寄存器的ACKSTAT=0;
6.MSSP模块在第九个时钟周期产生一个中断,使SSPIF=1(需要软件清零);
7.用户使RCEN1=1,开始一次接收;
8.MSSP模块在接收到8位数据后使SSPIF=1(需要软件清零);
9.用户设置ACKDT=0(应答)或1(不应答),并使ACKEN=1(需要软件清零),使ACKDT从SDA送出;
10.MSSP模块在第九个时钟周期产生一个中断,使SSPIF=1(需要软件清零);
11.用户设置PEN=1,产生一个停止条件;
12.一旦停止条件完成就会产生一个中断。
波特率
波特率发生器自动加载SSPADD中的值;
I2C主模式发送
4 ACKSTAT状态标志
当从设备应答时,ACKSTAT=0,没有应答时,ACKSTAT=1;