需求做的作业小结如下:
1、MCU的I2C选用IO口模仿完成;
2、MCU作为I2C主设备与守时芯片RX-8025SA树立通讯;
3、完成守时闹钟、守时唤醒及睡觉的功用;
调试进程:
1、IO口模仿I2C的代码在网上是能够找得到的。可是在详细的项目中,由于时钟的的不同在时序的操控上有差异,需求再调试。
在详细项目中调试I2C时,需求留意一下几点:
1)I 2C设备的地址,有的描绘办法是7位,有的描绘办法是8位。
留意只需代码和实践的设备地址相共同就好的。关于7位地址的使用办法无非描绘的是8位地址的高7位,由于最终一位是固定的。(读的时分是1,写的时分是0)。
2)I2C通讯协议自身并没有规定在通讯进程中,传输的字节数。可是,有的设备或许只允许传输1个字节,或许两个字节,或许固定位数以内的字节。详细的规矩要看从设备的规格书。
3)有的I2C设备只能写,不能读,这点也需求留意。
4)2C从设备的通讯速率,即数据传输速度,不同设备之间会有所不同,所以,要考虑兼容性的问题。
5)有的设备或许是10位地址,写地址的时分,需求送两次设备地址。
6)设备的程序编写尽量标准。总线要开释的时分,最好把I/O设置为输进口。有的程序编写的做法是,开释总线即把I/O设置为高,这样欠好。
7)时序的操控上,要契合设备的规格书的要求:
手头有示波器的话,这儿介绍一个比较适用且功率较高的调试办法。用示波器两路的探头直接接到I2C的数据线SDA和时钟线SCL上,上电后获取两路波形,再依据I2C通讯协议读取通讯数据,这样就能够看出是哪里的时序出的问题。
2、I2C通讯OK就需求依据RX-8025SA的规格书来完成项目所需求的守时功用啦。
以完成闹钟功用为例阐明:(请检查RX-8025SA的规格书)
1、8025芯片中有一个警报D功用:
警报D 功用指可从/INTA 引脚取得对[时+分]中止信号的功用。
即当当时时间(星期+时+分)与Alarm_D 设守时间共一起,/INTA 置L,
DALE 方位1。
2、将该/INTA连到MCU的RA5引脚上,MCU经过判别RA5引脚的L or H,
以及当时设备是否处于关机状况,当一起满意 RA5 = L 且 开机状况时,
MCU告诉设备,设备再依据相关设置判别是否出闹钟提示。
3、设定警报D时间的办法如下:
1)将本DALE bit 设置为0 使Alarm_D 无效;
注:这是为了防止警报设定中现行时间与警报时间恰巧共一起,输出/INTA=L。
2)其次设定星期时分DAFG bit;
3)最终将DALE 设定为1 使警报D 功用有用;
4、开机初始化:将DAFG和WAFG 置0; 使警报W/警报D在开机瞬间当次无效。
3、附上模仿I2C通讯的代码(网上查找一下):
void IIC_str ( void )
{
IIC_SCL=0;
IIC_SDA=1;
_nop_();
_nop_();
IIC_SCL=1;
nops();
IIC_SDA=0;// 开端
nops();
IIC_SCL=0;
return;
}
void IIC_stop ( void )
{
IIC_SCL=0;
IIC_SDA=0;
_nop_();
_nop_();
IIC_SCL=1;
nops();
IIC_SDA=1;// 结束
nops();
return;
}
void IIC_ack ( bit ack )
{
IIC_SCL=0;
_nop_();
_nop_();
if ( ack )
IIC_SDA=0;//应对
else
IIC_SDA=1;//非应对
nops();
IIC_SCL=1;
nops();
IIC_SCL=0;
}
bit IIC_send_byte ( uchar c )
{
ucharouttime;
uchar bitnum;
outtime=0;
for ( bitnum=0; bitnum<8; bitnum++ )
{
IIC_SCL=0;
if ( ( c<// 发送一个字接
IIC_SDA=1;
else
IIC_SDA=0;
_nop_();
IIC_SCL=1;
nops();
nops();
IIC_SCL=0;
}
IIC_SDA=0;
IIC_SDA=1;// 预备接纳应对信号
_nop_(); _nop_(); _nop_(); _nop_();
IIC_SCL=1;// 开端承受应对信号
while ( IIC_SDA )// 超时判别
{
if ( ( outtime++ )>250 )// 不能接纳到应对信号,中止IIC通讯,回来0值报错
{
outtime=0;
IIC_stop();
return( 0 ) ;
}
}
outtime=0;
IIC_SCL=0;
return ( 1 );// 发送结束,回来1值,通讯成功
}
uchar IIC_read_byte ( bit ack )
{
uchar retc;
uchar bitnum;
retc=0;//接纳存储清0
IIC_SCL=0;
nops();
IIC_SDA=1;
for ( bitnum=0; bitnum<8; bitnum++ )
{
_nop_();
IIC_SCL=0;
IIC_SDA=1;//预备承受
nops();
IIC_SCL=1;//接纳
nops();
retc<<=1;
if ( IIC_SDA )//接纳数据位判别
retc+=1;
}
IIC_SCL=0;
_nop_();
_nop_();
_nop_();
IIC_SDA=1;
IIC_ack( ack );//应对信号
return retc;
}
void IIC_send_noadder ( uchar adder, uchar ddata )
{
bit ack;
IIC_str ();
ack=IIC_send_byte ( adder );//发送地址
if ( !ack )
{alarm=0;
return ; }
nops();
ack=IIC_send_byte ( ddata );//发送数据
if ( !ack )
{ alarm=0;
return ;}
IIC_stop ();
return ;
}
void IIC_read_noadder ( uchar adder, uchar *buf, uchar num )
{
bit ack;
uchar i;
IIC_str ();
ack=IIC_send_byte ( adder );//发送地址
if ( !ack )
{ alarm=0;
return ;}
nops();
for ( i=0; i
{
*( buf++ )=IIC_read_byte ( 1 );//接纳数据存储倒*buf
}
IIC_stop ();
return ;
}
void IIC_send_adder ( uchar adder , uchar sub , uchar ddata )
{
bit ack;
IIC_str();
ack=IIC_send_byte ( adder );//发送从机地址
if ( !ack )
{
alarm=0;
return ;}
ack=IIC_send_byte ( sub );//发送从机子地址
if ( !ack )
{ alarm=0;
return ;}
ack=IIC_send_byte ( ddata );//发送数据
if ( !ack )
{ alarm=0;
return ;}
IIC_stop ();
return ;
}
void IIC_read_adder ( uchar adder, uchar sub, uchar *buf, uchar num )
{
bit ack;
uchar i;
IIC_str ();
ack=IIC_send_byte ( adder );//发送从机地址
if ( !ack )
{ alarm=0;
return ;}
ack=IIC_send_byte ( sub );//发送从机子地址
if ( !ack )
{ alarm=0;
return ;}
for ( i=0; i
{
*( buf++ )=IIC_read_byte ( 1 );//接纳数据存储倒*buf
}
I%&&&&&%_stop ();
return ;
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/268283.html