返回列表 发新帖

SAM4E-EK开发板代码解读10——PCF8563

[复制链接] 0
回复
20572
查看
打印 上一主题 下一主题

28

主题

45

帖子

1万

积分

允许发帖

积分
10186
楼主
跳转到指定楼层
发表于 2020-5-14 10:55:09 | 只看该作者 回帖奖励 |倒序浏览 | 阅读模式
本帖最后由 Mcuzone_TKN 于 2020-5-14 10:54 编辑

关键词:Microchip Atmel  SAM4E SAM4E-EK  SAM4E16E 芯片 PCF8563 I2C PHILIPS


概述:简要介绍I2C


I2C总线是由PHILIPS公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
I2C只有两根线,分别为SDA(串行数据线)和SCL(串行时钟线),都是双向IO线。
数据的有效性:SDA线上的数据必须在SCL高电平周期保持稳定,SDA的高低电平只有在SCL为低电平时才能改变。
I2C传输字节时,要先有个起始信号,结束传输字节时,需要一个停止信号。
起始信号:SCL为高时,SDA从高到低。
停止信号:SCL为高时,SDA从低到高


打开产品光盘SAM4E16E-EK/SAM4E16E-EK中文资料/softpack软件包/Atmel Studio 7,打开13c_PCF8563例子。


//I2C起始信号
void iic_start()
{
SDA_1;
delay_us(4);
SCL_1;
delay_us(4);
SDA_0;
delay_us(4);
SCL_0;
delay_us(4);
}

//I2C停止信号
void iic_stop()
{
SCL_0;
delay_us(4);
SDA_0;
delay_us(4);
SCL_1;
delay_us(4);
SDA_1;
delay_us(4);
}

//CPU产生一个ACK信号
void iic_ack()
{
SDA_0;
delay_us(4);
SCL_1;
delay_us(4);
SCL_0;
delay_us(4);
SDA_1;
delay_us(4);
}

//CPU产生一个非ACK信号
void iic_NoAck()
{
SDA_1;
delay_us(4);
SCL_1;
delay_us(4);
SCL_0;
delay_us(4);
SDA_0;
/*delay_us(4);*/
}

//I2C写8个位
void iic_write8bit(unsigned char input)

{
unsigned char temp;
for(temp=8;temp!=0;temp--)
{
  if(input&0x80) SDA_1;
  else  SDA_0;
  delay_us(4);
  SCL_1;
  delay_us(4);
  SCL_0;
  delay_us(4);
  input=input<<1;
}
SCL_0;
delay_us(4);
SDA_1;//释放总线
delay_us(4);
SCL_0;
delay_us(4);//接收一个ACK,不做处理
SCL_1;
delay_us(4);
    SCL_0;
/*delay_us(4);*/
}

//I2C读8个位
unsigned char iic_read8bit(unsigned char b)
{
unsigned char temp,rbyte=0;
//PORTC_DIR &= 0xfe;
ioport_set_pin_dir(SDA, IOPORT_DIR_INPUT);
delay_us(4);//
for(temp=8;temp!=0;temp--)
{
  SCL_1;
  delay_us(4);
  //if(PORTC_IN&0x01)
  if(ioport_get_pin_level(SDA)&0x01)
  {
   rbyte = rbyte << 1;
   rbyte += 1;
  }
  else  rbyte = rbyte << 1;
  SCL_0;
  delay_us(4);//
}
//iic_NoAck();
//PORTC_DIR |= 0x01;
ioport_set_pin_dir(SDA, IOPORT_DIR_OUTPUT);
if(b)//每收一个数后发送ACK或nACK
SDA_1;
else
SDA_0;

delay_us(4);
SCL_1;
delay_us(4);
SCL_0;
delay_us(4);
SDA_1;        //释放总线
delay_us(100);

return rbyte;

}

//将一个字节写入指定地址
void I2cByteWrite(unsigned char device,uint addr,unsigned char bytedata)
{
iic_start();
delay_us(4);
iic_write8bit(device);
delay_us(4);
iic_write8bit(addr);
delay_us(4);
iic_write8bit(bytedata);
delay_us(4);
//iic_NoAck();
iic_stop();
}


//从指定地址读取一个字节
unsigned char I2cByteRead(unsigned char device,unsigned char addr)
{
unsigned char Dat=0;

iic_start();
iic_write8bit(device);
delay_us(4);
iic_write8bit(addr);
delay_us(4);
iic_start();//Restart
//iic_write8bit(0xd1);//DS3231读数
iic_write8bit(0xa3);//PCF8563 读数
delay_us(4);
Dat=iic_read8bit(1);//只接收一个字节,所以发nACK
/*iic_NoAck();*/
iic_stop();
return Dat;
}



回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表