1、使用配置流程
- 初始化iic
将EAXFR(P_SW2最高位)置1
设置iic脚
配置I2CCFG寄存器,主机模式使能IIC及速度
清0 I2CMSST寄存器
将EAXFR(P_SW2最高位)清0 - 写、读等
2、相关寄存器
- 外设端口切换控制寄存器 2
- IIC 配置寄存器
- I 2 C 主机控制寄存器
- I2C 状态寄存器
- I 2 C 数据寄存器
3、代码
IIC初始化
void iic_init(IICN_enum iic_n,uint32 wait_time)
{
scl_pin = scl_pin;
sda_pin = sda_pin;
P_SW2 |= 1<<7; //将EAXFR寄存器置1,这样才能使用特殊功能寄存器为扩展SFR,访问逻辑地址位于 XDATA 区域
P_SW2 &= ~(0x03<<4); //清除引脚切换位
switch(iic_n)
{
case IIC_1:
P_SW2 |= (0x00<<4); //SCL:P1.5 SDA:P1.4
break;
case IIC_2:
P_SW2 |= (0x01<<4); //SCL:P2.5 SDA:P2.4
break;
case IIC_3:
P_SW2 |= (0x02<<4); //SCL:P7.7 SDA:P7.6
break;
case IIC_4:
P_SW2 |= (0x03<<4); //SCL:P3.2 SDA:P3.3
break;
}
I2CCFG |= 1<<6; //主机模式
I2CCFG |= 1<<7; //使能IIC
I2CCFG |= wait_time;//速度设置为等待wait_time*2+1个时钟
I2CMSST = 0x00; //主机状态寄存器
P_SW2 &= ~(1<<7);
}
4、GPIO模拟IIC
使用模拟IIC,往OLED屏写数据
#include "stc15.h"
// ------------------------------------------------------------
// IO口模拟I2C通信
// SCL接P1^3
// SDA接P1^2
// ------------------------------------------------------------
sbit SCL=P1^3; //串行时钟
sbit SDA=P1^2; //串行数据
#define high 1
#define low 0
//IIC 起始信号
void IIC_Start()
{
SCL = high;
SDA = high;
SDA = low;
SCL = low;
}
//IIC 终止信号
void IIC_Stop()
{
SCL = low;
SDA = low;
SCL = high;
SDA = high;
}
// 通过I2C总线写一个字节
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
for(i=0;i<8;i++) //发送8次,也就是8位1个字节
{
if(IIC_Byte & 0x80) //判断最高位是0还是1
SDA=high; //1就置高电平
else
SDA=low; //0就清0
SCL=high; //时钟置1,读取SDA数据
SCL=low; //拉低时钟,切换SDA数据,等待发下一位
IIC_Byte<<=1; //左移1位,发送第下位
}
SDA=1; //释放数据线,等待低电平应答信号
SCL=1; //拉高等待应答信号,
i=0;
while((SDA==1)&&(i<250))i++;//等待应答,250个cpu时钟周期
SCL=0; //拉低时钟,等待下一次发送
}
/*********************OLED写数据************************************/
void OLED_WrDat(unsigned char IIC_Data)
{
IIC_Start(); //起始信号
Write_IIC_Byte(0x78); //OLED默认地址0x78
Write_IIC_Byte(0x40); //写数据
Write_IIC_Byte(IIC_Data);
IIC_Stop();
}