/**********************************************
//IIC Start
时钟信号在高电平状态时候在数据线产生一个下降沿
**********************************************/
void IIC_Start()
{
OLED_SCLK_Set() ;
OLED_SDIN_Set();
OLED_SDIN_Clr();
}
/**********************************************
//IIC Stop
时钟信号在高电平状态时候在数据线产生一个上升沿
**********************************************/
void IIC_Stop()
{
OLED_SCLK_Set();
OLED_SDIN_Clr();
OLED_SDIN_Set();
}
//这里就是跳过这个时钟周期,没有去读数据位有没有回来应答信号。
void IIC_Wait_Ack()
{
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
在时钟线为低电平的时候在数据线发送数据位,高位在前
在完成数据发送后要保持数据线为低电平
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
for(i=0;i<8;i++)
{
m=da;
OLED_SCLK_Clr();
m=m&0x80;
if(m==0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
da=da<<1;
OLED_SCLK_Set();
}
OLED_SCLK_Clr();
}
/**********************************************
// IIC Write Command
开始信号
前8位为:写7位地址,高位在前,并跟随1个读写位0,表示写入:0111 100 0
第9位应答,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
接下已一个字节发送0x00表示后面要写命令
接下来应答位,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
后面开始写入的数据作为命令,即将命令字节装载到这个发送字节的函数里发送出去
然后又是一个应答位,跳过一个时钟信号
之后发送停止指令。
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
IIC_Wait_Ack();
Write_IIC_Byte(0x00); //write command
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Command);
IIC_Wait_Ack();
IIC_Stop();
}
/**********************************************
// IIC Write Data
开始信号
前八位为:写7位地址,高位在前,并跟随1个读写位0,表示写入:0111 100 0
第9位应答,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
接下已一个字节发送0x40表示后面要写的是数据
接下来应答位,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
后面开始写入的数据作为数据,即将数据字节装载到这个发送字节的函数里发送出去
然后又是一个应答位,跳过一个时钟信号
之后发送停止指令。
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78); //D/C#=0; R/W#=0
IIC_Wait_Ack();
Write_IIC_Byte(0x40); //write data
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();
IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
if(cmd)
{
Write_IIC_Data(dat);
}
else
{
Write_IIC_Command(dat);
}
}
看过了微芯大学课程中I2C的部分,然后对之前用过的这个IO模拟I2C驱动OLED的底层函数进行了优化和注释,删除了多余的操作指令。
这个注释可以让你清楚的看明白,什么是起始信号,结束信号,应答信号,以及信息通过I2C传递的顺序。
|