6.位传输
每个时钟脉冲传送一位数据。SCL为高时SDA必须保持稳定,因为此时SDA的改变被认为是控制信号。
由位衍生出字节传输 先传输高位
void iicSendOne(u8 dat) //发送一个字节
{
u8 i=8;
SCL = 0;
SDA = 0;
do
{
if( dat& 0x80 )
SDA = 1;
else
SDA = 0;
Delay2us();
dat<<=1;
SCL = 1;
Delay2us();
SCL = 0;
Delay2us();
}
while(--i);
}
7.应答也不别看手册了看stc32手册吧
函数里的ack为全局变量,需要自己定义。
void iicSendAck(void) //ack
{
SDA = 0;
Delay2us();
SCL = 1;
Delay2us();
SCL = 0;
Delay2us();
}
void iicSendNoAck(void) //noack
{
SDA = 1;
Delay2us();
SCL = 1;
Delay2us();
SCL = 0;
Delay2us();
}
void iicDengAck(void) //等到从机ACK1是不应答0是应答
{
SDA = 1;
Delay2us();
SCL = 1;
Delay2us();
ack = SDA;
Delay2us();
SCL = 0;
Delay2us();
}
8.写操作写一个字节和写一页(1-8个字节)写一个字节包含在了写页
void IIC_Write_NByte(unsigned char *p,unsigned char number ) //iic写入连续的几个字节
{
iicStart();
iicSendOne(0xa0); //器件地址
iicDengAck();
if( !ack )
{
iicSendOne(0); //写开始字节
iicDengAck();
if( !ack )
{
do
{
iicSendOne(*p);
p++;
iicDengAck();
if( ack ) //1为不应答
break;
}
while(--number);// number为写入连续的几个注意1页为8个 比如5开始 只能写到7,其他的写入0 1 2 3后推
}
}
iicStop();
}
zhange 发表于 2024-5-21 19:36
老哥问下6楼的那个图写周期啥意思???看不懂了
就是给缓存区填入数据并停止总线后,EEPROM开始将数据写入存储器,这个时间周期就叫写周期,当前写周期结束前,不可再次写入数据。所以写一页就得等待5ms,然后才能再写一页。 晓飛飛 发表于 2024-5-21 20:34
就是给缓存区填入数据并停止总线后,EEPROM开始将数据写入存储器,这个时间周期就叫写周期,当前写周期结 ...
谢谢 慢慢消化 9.读操作与写操作初始化相同,只是器件地址中的读/写选择位应为"1"。有三种不同的读操作方式:当前地址读,随机读和顺序读。这里只演示随机读。
随机读需先写一个目标字地址, 一旦EEPROM接收器件地址和字地址并应答了ACK,主 器件就产生一个重复的起始条件。然后,主器件发送器件地址(读/写选择位为"1"), EEPROM应答ACK,并随时钟送出数 据。主器件无需应答"0",但需发送停止条件。
void IIC_Read_NByte(unsigned char *p,unsigned char number) //iic读取连续的几个字节
{
iicStart();
iicSendOne(0xa0); //从机地址这里是写
iicDengAck();
if( !ack )
{
P60=0;
iicSendOne(0); //读取开始的地址
iicDengAck();
if( !ack )
{
iicStart();
iicSendOne(0xa1);//fa发送从机地址和读标志位
iicDengAck();
if( !ack )
{
do
{
*p = iicDuOne();
p++;
if( number!=1 )
iicSendAck();
}
while(--number);
iicSendNoAck;
}
}
}
iicStop();
}
本帖最后由 zhange 于 2024-5-22 06:36 编辑
10.说明书没没有读取看stc32手册 时序图
u8 iicDuOne(void) //读取一个字节
{
u8 i=8,dat=0;
SCL = 0;
SDA = 1;
do
{
SCL = 1;
Delay2us();
dat<<=1; //因为先传出来的是高位要左移。
if( SDA )
dat |= 1;
SCL = 0;
Delay2us();
我这里读取的是开机次数,已经成功
iic软件模拟eeprom存储开机时间源码
需要自己改动eeprom地址,我没打开入口参数
模拟IIC通讯,我以为是硬件IIC。不过很基础很详尽的,很值得学习。
页:
1
[2]