Mcuzone 野芯科技
标题:
SAM4E-EK开发板代码解读10——PCF8563
[打印本页]
作者:
Mcuzone_TKN
时间:
2020-5-14 10:55
标题:
SAM4E-EK开发板代码解读10——PCF8563
本帖最后由 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;
}
欢迎光临 Mcuzone 野芯科技 (http://testbbs.mcuzone.com/)
Powered by Discuz! X3.1