百韵网 >>  正文

怎么从I2C总线读数据 I2C总线如何直接搭载数据写数据读数据

来源:www.baiyundou.net   日期:较早时间
i2c有其协议的,我当时从不会到掌握其协议用了一阵子,就是狂读协议和例程

我把当时用非斯卡尔单片机读i2c mems传感器的历程写在下面

#include <hidef.h>
#include "derivative.h"

#define IIC_SDA_CTL PTCDD_PTCDD1
#define IIC_SDA_DAT PTCD_PTCD1
#define IIC_SCL_CTL PTCDD_PTCDD0
#define IIC_SCL_DAT PTCD_PTCD0
#define IIC_MST_HI 0
#define IIC_MST_LO 1

void IIC_Start(void);
void IIC_Restart(void);
void IIC_Stop(void);
byte IIC_SendByte(byte);
byte IIC_Read(byte *, byte);
byte IIC_Write(byte *, byte);
void IIC_Delay(void);

void IIC_Delay(void)
{
byte i;
for (i=0;i<8;i++) {}
}

//==============================================================
// Master generates a START condition on IIC bus
//==============================================================
void IIC_Start(void)
{
IIC_SDA_CTL = IIC_MST_HI;
IIC_SCL_CTL = IIC_MST_HI;

IIC_Delay();
IIC_SDA_CTL = IIC_MST_LO;
IIC_SDA_DAT = 0;
IIC_Delay();
IIC_SCL_CTL = IIC_MST_LO;
IIC_SCL_DAT = 0;
IIC_Delay();
}

//==============================================================
// Master generates a RESTART condition on IIC bus
//==============================================================
void IIC_Restart(void)
{
IIC_SDA_CTL = IIC_MST_HI; //SDA back to high while SCL remain in low
IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI; //SCL back to high, bus idle now
IIC_Delay();
IIC_SDA_CTL = IIC_MST_LO; //RESTART condition occur
IIC_Delay();
IIC_SCL_CTL = IIC_MST_LO; //SCL to low for standby
IIC_Delay();
}

//==============================================================
// Master generates a STOP condition on IIC bus
//==============================================================
void IIC_Stop(void)
{
IIC_SDA_CTL = IIC_MST_LO; //make sure SDA is low
IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI; //I2C_SCL_CTL go to high first
IIC_Delay();
IIC_SDA_CTL = IIC_MST_HI; //I2C_SDA_CTL have low-high transition while SCL is high
IIC_Delay();
}

//==============================================================
// Master send out a byte of data and return with ACK/NACK
// return with 0x00 if ACK received
// return with 0xff if NACK received
//==============================================================
byte IIC_SendByte(byte outDat)
{
byte bit;

//send out 8-bit data
for (bit=0;bit<8;bit++) {
if (outDat&0x80)
IIC_SDA_CTL = IIC_MST_HI;
else
IIC_SDA_CTL = IIC_MST_LO;
IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL = IIC_MST_LO;
outDat <<= 1;
}

//check for the ACK/NACK
IIC_SDA_CTL = IIC_MST_HI; //master release SDA
IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI; //master send a clock
IIC_Delay();
if (IIC_SDA_DAT) bit = 0xff; //NACK
else bit = 0; //ACK
IIC_SCL_CTL = IIC_MST_LO;
IIC_Delay();

return(bit);
}

//==============================================================
// Master write a string of bytes through IIC us
// Return with 0x00 if successful
// Return with 0xff if failed
//==============================================================
byte IIC_Write(byte *buff, byte total)
{
while (total) {
if (IIC_SendByte(*buff++)) //get NACK after data byte out
return(0xff); //abort
total--;
//__RESET_WATCHDOG(); //needed only for EEPROM byte-program
}
return(0);
}

//==============================================================
// Master read a byte of data and set ACK/NACK
// return with data read
//==============================================================
byte IIC_ReadByte(byte ackFlag)
{
byte bit, dat;

IIC_SDA_CTL = IIC_MST_HI; //make sure master release SDA

//read 8 bits sof data
for (bit=0;bit<8;bit++) {
dat <<= 1;
IIC_SCL_CTL = IIC_MST_HI;
IIC_Delay();
if (IIC_SDA_DAT) //read back data
dat |= 0x01;
IIC_SCL_CTL = IIC_MST_LO;
IIC_Delay();
}

//echo with ACK/NACK
if (ackFlag==0)
IIC_SDA_CTL = IIC_MST_LO; //echo back ACK
else
IIC_SDA_CTL = IIC_MST_HI; //echo back NACK

IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL = IIC_MST_LO;
IIC_Delay();

return(dat);
}

//==============================================================
// Master read a string of data bytes through IIC us
//==============================================================
byte IIC_Read(byte *buff, byte total)
{
byte count;

if (total==0) return(0);

if (total==1) { //read one byte only
buff[0] = IIC_ReadByte(1); //NACK after read
return(1);
}

else { //read more than one bytes
count = 0;
while(total>1) {
IIC_Delay();
buff[count++] = IIC_ReadByte(0); //ACK after read
total--;
__RESET_WATCHDOG();
}
IIC_Delay();
buff[count++] = IIC_ReadByte(1);
return(count);
}
}

然后你去网上搜索iic总线协议,把协议多读几遍慢慢就会了~~要不你把邮箱给我我发给你.总之很简单的 不用害怕,学学就会了

i2c总线是phlips公司推出的一种串行总线,i2c总线只有两根双向信号线。其中一根是数据线sda,另一根是时钟线scl。
(1)基本过程:
1.主机发出开始信号
2.主机接着发出一字节的从机地址信息,其中最低位为读写控制码(1为读、0为写)高七位为从机器件地址
3.从机发出认可信号
4.主机开始发送信号,每发完一字节后,从机发出认可信号给主机
5.主机发出停止信号

i2c有其协议的,我当时从不会到掌握其协议用了一阵子,就是狂读协议和例程
我把当时用非斯卡尔单片机读i2c
mems传感器的历程写在下面
#include
<hidef.h>
#include
"derivative.h"
#define
IIC_SDA_CTL
PTCDD_PTCDD1
#define
IIC_SDA_DAT
PTCD_PTCD1
#define
IIC_SCL_CTL
PTCDD_PTCDD0
#define
IIC_SCL_DAT
PTCD_PTCD0
#define
IIC_MST_HI
0
#define
IIC_MST_LO
1
void
IIC_Start(void);
void
IIC_Restart(void);
void
IIC_Stop(void);
byte
IIC_SendByte(byte);
byte
IIC_Read(byte
*,
byte);
byte
IIC_Write(byte
*,
byte);
void
IIC_Delay(void);
void
IIC_Delay(void)
{
byte
i;
for
(i=0;i<8;i++)
{}
}
//==============================================================
//
Master
generates
a
START
condition
on
IIC
bus
//==============================================================
void
IIC_Start(void)
{
IIC_SDA_CTL
=
IIC_MST_HI;
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
IIC_SDA_CTL
=
IIC_MST_LO;
IIC_SDA_DAT
=
0;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_SCL_DAT
=
0;
IIC_Delay();
}
//==============================================================
//
Master
generates
a
RESTART
condition
on
IIC
bus
//==============================================================
void
IIC_Restart(void)
{
IIC_SDA_CTL
=
IIC_MST_HI;
//SDA
back
to
high
while
SCL
remain
in
low
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
//SCL
back
to
high,
bus
idle
now
IIC_Delay();
IIC_SDA_CTL
=
IIC_MST_LO;
//RESTART
condition
occur
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
//SCL
to
low
for
standby
IIC_Delay();
}
//==============================================================
//
Master
generates
a
STOP
condition
on
IIC
bus
//==============================================================
void
IIC_Stop(void)
{
IIC_SDA_CTL
=
IIC_MST_LO;
//make
sure
SDA
is
low
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
//I2C_SCL_CTL
go
to
high
first
IIC_Delay();
IIC_SDA_CTL
=
IIC_MST_HI;
//I2C_SDA_CTL
have
low-high
transition
while
SCL
is
high
IIC_Delay();
}
//==============================================================
//
Master
send
out
a
byte
of
data
and
return
with
ACK/NACK
//
return
with
0x00
if
ACK
received
//
return
with
0xff
if
NACK
received
//==============================================================
byte
IIC_SendByte(byte
outDat)
{
byte
bit;
//send
out
8-bit
data
for
(bit=0;bit<8;bit++)
{
if
(outDat&0x80)
IIC_SDA_CTL
=
IIC_MST_HI;
else
IIC_SDA_CTL
=
IIC_MST_LO;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
outDat
<<=
1;
}
//check
for
the
ACK/NACK
IIC_SDA_CTL
=
IIC_MST_HI;
//master
release
SDA
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
//master
send
a
clock
IIC_Delay();
if
(IIC_SDA_DAT)
bit
=
0xff;
//NACK
else
bit
=
0;
//ACK
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_Delay();
return(bit);
}
//==============================================================
//
Master
write
a
string
of
bytes
through
IIC
us
//
Return
with
0x00
if
successful
//
Return
with
0xff
if
failed
//==============================================================
byte
IIC_Write(byte
*buff,
byte
total)
{
while
(total)
{
if
(IIC_SendByte(*buff++))
//get
NACK
after
data
byte
out
return(0xff);
//abort
total--;
//__RESET_WATCHDOG();
//needed
only
for
EEPROM
byte-program
}
return(0);
}
//==============================================================
//
Master
read
a
byte
of
data
and
set
ACK/NACK
//
return
with
data
read
//==============================================================
byte
IIC_ReadByte(byte
ackFlag)
{
byte
bit,
dat;
IIC_SDA_CTL
=
IIC_MST_HI;
//make
sure
master
release
SDA
//read
8
bits
sof
data
for
(bit=0;bit<8;bit++)
{
dat
<<=
1;
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
if
(IIC_SDA_DAT)
//read
back
data
dat
|=
0x01;
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_Delay();
}
//echo
with
ACK/NACK
if
(ackFlag==0)
IIC_SDA_CTL
=
IIC_MST_LO;
//echo
back
ACK
else
IIC_SDA_CTL
=
IIC_MST_HI;
//echo
back
NACK
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_Delay();
return(dat);
}
//==============================================================
//
Master
read
a
string
of
data
bytes
through
IIC
us
//==============================================================
byte
IIC_Read(byte
*buff,
byte
total)
{
byte
count;
if
(total==0)
return(0);
if
(total==1)
{
//read
one
byte
only
buff[0]
=
IIC_ReadByte(1);
//NACK
after
read
return(1);
}
else
{
//read
more
than
one
bytes
count
=
0;
while(total>1)
{
IIC_Delay();
buff[count++]
=
IIC_ReadByte(0);
//ACK
after
read
total--;
__RESET_WATCHDOG();
}
IIC_Delay();
buff[count++]
=
IIC_ReadByte(1);
return(count);
}
}
然后你去网上搜索iic总线协议,把协议多读几遍慢慢就会了~~要不你把邮箱给我我发给你.总之很简单的
不用害怕,学学就会了

i2c有其协议的,我当时从不会到掌握其协议用了一阵子,就是狂读协议和例程
我把当时用非斯卡尔单片机读i2c
mems传感器的历程写在下面
#include
#include
"derivative.h"
#define
IIC_SDA_CTL
PTCDD_PTCDD1
#define
IIC_SDA_DAT
PTCD_PTCD1
#define
IIC_SCL_CTL
PTCDD_PTCDD0
#define
IIC_SCL_DAT
PTCD_PTCD0
#define
IIC_MST_HI
0
#define
IIC_MST_LO
1
void
IIC_Start(void);
void
IIC_Restart(void);
void
IIC_Stop(void);
byte
IIC_SendByte(byte);
byte
IIC_Read(byte
*,
byte);
byte
IIC_Write(byte
*,
byte);
void
IIC_Delay(void);
void
IIC_Delay(void)
{
byte
i;
for
(i=0;i<8;i++)
{}
}
//==============================================================
//
Master
generates
a
START
condition
on
IIC
bus
//==============================================================
void
IIC_Start(void)
{
IIC_SDA_CTL
=
IIC_MST_HI;
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
IIC_SDA_CTL
=
IIC_MST_LO;
IIC_SDA_DAT
=
0;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_SCL_DAT
=
0;
IIC_Delay();
}
//==============================================================
//
Master
generates
a
RESTART
condition
on
IIC
bus
//==============================================================
void
IIC_Restart(void)
{
IIC_SDA_CTL
=
IIC_MST_HI;
//SDA
back
to
high
while
SCL
remain
in
low
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
//SCL
back
to
high,
bus
idle
now
IIC_Delay();
IIC_SDA_CTL
=
IIC_MST_LO;
//RESTART
condition
occur
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
//SCL
to
low
for
standby
IIC_Delay();
}
//==============================================================
//
Master
generates
a
STOP
condition
on
IIC
bus
//==============================================================
void
IIC_Stop(void)
{
IIC_SDA_CTL
=
IIC_MST_LO;
//make
sure
SDA
is
low
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
//I2C_SCL_CTL
go
to
high
first
IIC_Delay();
IIC_SDA_CTL
=
IIC_MST_HI;
//I2C_SDA_CTL
have
low-high
transition
while
SCL
is
high
IIC_Delay();
}
//==============================================================
//
Master
send
out
a
byte
of
data
and
return
with
ACK/NACK
//
return
with
0x00
if
ACK
received
//
return
with
0xff
if
NACK
received
//==============================================================
byte
IIC_SendByte(byte
outDat)
{
byte
bit;
//send
out
8-bit
data
for
(bit=0;bit<8;bit++)
{
if
(outDat&0x80)
IIC_SDA_CTL
=
IIC_MST_HI;
else
IIC_SDA_CTL
=
IIC_MST_LO;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
outDat
<<=
1;
}
//check
for
the
ACK/NACK
IIC_SDA_CTL
=
IIC_MST_HI;
//master
release
SDA
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
//master
send
a
clock
IIC_Delay();
if
(IIC_SDA_DAT)
bit
=
0xff;
//NACK
else
bit
=
0;
//ACK
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_Delay();
return(bit);
}
//==============================================================
//
Master
write
a
string
of
bytes
through
IIC
us
//
Return
with
0x00
if
successful
//
Return
with
0xff
if
failed
//==============================================================
byte
IIC_Write(byte
*buff,
byte
total)
{
while
(total)
{
if
(IIC_SendByte(*buff++))
//get
NACK
after
data
byte
out
return(0xff);
//abort
total--;
//__RESET_WATCHDOG();
//needed
only
for
EEPROM
byte-program
}
return(0);
}
//==============================================================
//
Master
read
a
byte
of
data
and
set
ACK/NACK
//
return
with
data
read
//==============================================================
byte
IIC_ReadByte(byte
ackFlag)
{
byte
bit,
dat;
IIC_SDA_CTL
=
IIC_MST_HI;
//make
sure
master
release
SDA
//read
8
bits
sof
data
for
(bit=0;bit<8;bit++)
{
dat
<<=
1;
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
if
(IIC_SDA_DAT)
//read
back
data
dat
|=
0x01;
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_Delay();
}
//echo
with
ACK/NACK
if
(ackFlag==0)
IIC_SDA_CTL
=
IIC_MST_LO;
//echo
back
ACK
else
IIC_SDA_CTL
=
IIC_MST_HI;
//echo
back
NACK
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_Delay();
return(dat);
}
//==============================================================
//
Master
read
a
string
of
data
bytes
through
IIC
us
//==============================================================
byte
IIC_Read(byte
*buff,
byte
total)
{
byte
count;
if
(total==0)
return(0);
if
(total==1)
{
//read
one
byte
only
buff[0]
=
IIC_ReadByte(1);
//NACK
after
read
return(1);
}
else
{
//read
more
than
one
bytes
count
=
0;
while(total>1)
{
IIC_Delay();
buff[count++]
=
IIC_ReadByte(0);
//ACK
after
read
total--;
__RESET_WATCHDOG();
}
IIC_Delay();
buff[count++]
=
IIC_ReadByte(1);
return(count);
}
}
然后你去网上搜索iic总线协议,把协议多读几遍慢慢就会了~~要不你把邮箱给我我发给你.总之很简单的
不用害怕,学学就会了

i2c有其协议的,我当时从不会到掌握其协议用了一阵子,就是狂读协议和例程
我把当时用非斯卡尔单片机读i2c
mems传感器的历程写在下面
#include
<hidef.h>
#include
"derivative.h"
#define
IIC_SDA_CTL
PTCDD_PTCDD1
#define
IIC_SDA_DAT
PTCD_PTCD1
#define
IIC_SCL_CTL
PTCDD_PTCDD0
#define
IIC_SCL_DAT
PTCD_PTCD0
#define
IIC_MST_HI
0
#define
IIC_MST_LO
1
void
IIC_Start(void);
void
IIC_Restart(void);
void
IIC_Stop(void);
byte
IIC_SendByte(byte);
byte
IIC_Read(byte
*,
byte);
byte
IIC_Write(byte
*,
byte);
void
IIC_Delay(void);
void
IIC_Delay(void)
{
byte
i;
for
(i=0;i<8;i++)
{}
}
//==============================================================
//
Master
generates
a
START
condition
on
IIC
bus
//==============================================================
void
IIC_Start(void)
{
IIC_SDA_CTL
=
IIC_MST_HI;
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
IIC_SDA_CTL
=
IIC_MST_LO;
IIC_SDA_DAT
=
0;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_SCL_DAT
=
0;
IIC_Delay();
}
//==============================================================
//
Master
generates
a
RESTART
condition
on
IIC
bus
//==============================================================
void
IIC_Restart(void)
{
IIC_SDA_CTL
=
IIC_MST_HI;
//SDA
back
to
high
while
SCL
remain
in
low
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
//SCL
back
to
high,
bus
idle
now
IIC_Delay();
IIC_SDA_CTL
=
IIC_MST_LO;
//RESTART
condition
occur
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
//SCL
to
low
for
standby
IIC_Delay();
}
//==============================================================
//
Master
generates
a
STOP
condition
on
IIC
bus
//==============================================================
void
IIC_Stop(void)
{
IIC_SDA_CTL
=
IIC_MST_LO;
//make
sure
SDA
is
low
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
//I2C_SCL_CTL
go
to
high
first
IIC_Delay();
IIC_SDA_CTL
=
IIC_MST_HI;
//I2C_SDA_CTL
have
low-high
transition
while
SCL
is
high
IIC_Delay();
}
//==============================================================
//
Master
send
out
a
byte
of
data
and
return
with
ACK/NACK
//
return
with
0x00
if
ACK
received
//
return
with
0xff
if
NACK
received
//==============================================================
byte
IIC_SendByte(byte
outDat)
{
byte
bit;
//send
out
8-bit
data
for
(bit=0;bit<8;bit++)
{
if
(outDat&0x80)
IIC_SDA_CTL
=
IIC_MST_HI;
else
IIC_SDA_CTL
=
IIC_MST_LO;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
outDat
<<=
1;
}
//check
for
the
ACK/NACK
IIC_SDA_CTL
=
IIC_MST_HI;
//master
release
SDA
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
//master
send
a
clock
IIC_Delay();
if
(IIC_SDA_DAT)
bit
=
0xff;
//NACK
else
bit
=
0;
//ACK
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_Delay();
return(bit);
}
//==============================================================
//
Master
write
a
string
of
bytes
through
IIC
us
//
Return
with
0x00
if
successful
//
Return
with
0xff
if
failed
//==============================================================
byte
IIC_Write(byte
*buff,
byte
total)
{
while
(total)
{
if
(IIC_SendByte(*buff++))
//get
NACK
after
data
byte
out
return(0xff);
//abort
total--;
//__RESET_WATCHDOG();
//needed
only
for
EEPROM
byte-program
}
return(0);
}
//==============================================================
//
Master
read
a
byte
of
data
and
set
ACK/NACK
//
return
with
data
read
//==============================================================
byte
IIC_ReadByte(byte
ackFlag)
{
byte
bit,
dat;
IIC_SDA_CTL
=
IIC_MST_HI;
//make
sure
master
release
SDA
//read
8
bits
sof
data
for
(bit=0;bit<8;bit++)
{
dat
<<=
1;
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
if
(IIC_SDA_DAT)
//read
back
data
dat
|=
0x01;
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_Delay();
}
//echo
with
ACK/NACK
if
(ackFlag==0)
IIC_SDA_CTL
=
IIC_MST_LO;
//echo
back
ACK
else
IIC_SDA_CTL
=
IIC_MST_HI;
//echo
back
NACK
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL
=
IIC_MST_LO;
IIC_Delay();
return(dat);
}
//==============================================================
//
Master
read
a
string
of
data
bytes
through
IIC
us
//==============================================================
byte
IIC_Read(byte
*buff,
byte
total)
{
byte
count;
if
(total==0)
return(0);
if
(total==1)
{
//read
one
byte
only
buff[0]
=
IIC_ReadByte(1);
//NACK
after
read
return(1);
}
else
{
//read
more
than
one
bytes
count
=
0;
while(total>1)
{
IIC_Delay();
buff[count++]
=
IIC_ReadByte(0);
//ACK
after
read
total--;
__RESET_WATCHDOG();
}
IIC_Delay();
buff[count++]
=
IIC_ReadByte(1);
return(count);
}
}
然后你去网上搜索iic总线协议,把协议多读几遍慢慢就会了~~要不你把邮箱给我我发给你.总之很简单的
不用害怕,学学就会了

I2C总线如何直接搭载数据写数据读数据~

I2C总线是PHLIPS公司推出的一种串行总线,I2C总线只有两根双向信号线。其中一根是数据线SDA,另一根是时钟线SCL。

(1)基本过程:
1.主机发出开始信号
2.主机接着发出一字节的从机地址信息,其中最低位为读写控制码(1为读、0为写)高七位为从机器件地址
3.从机发出认可信号
4.主机开始发送信号,每发完一字节后,从机发出认可信号给主机
5.主机发出停止信号

SDA总线是双向数据线,是单片机的I/O脚,单片机输出时是单片机控制SDA的高低。但是读数据,即单片机输入时,数据是从I2C器件送来的。如果在读之前SDA=0,即不拉高,则SDA线就一直处于低电平状态,被拉低了。I2C不论送什么数据,都是0,即单片机只能读到全0了。
所以,必须先拉高,这样,SDA总线上才能受I2C器件控制,送出数据,单片机也才能读到正确的数据。

相关要点总结:

13343756791:Arduino IIC协议笔记
鲍菁答:第三,主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下:第三种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率。Arduino的IIC通信...

13343756791:51单片机I2C总线读写程序
鲍菁答:uchar readbyte(){ uchar i,k;SCL=0;delay();SDA=1;//为什么要置1,这是初始化数据线 for(i=0;i<8;i++){ SCL=1;delay();k=(k<<1)|SDA; //这一步什么意思,为什么要和SDA或,K的最低位0,SDA为数据,当然要或 SCL=0;delay();} delay();return k;} ...

13343756791:关于单片机模拟I2C的总线通信,读一个字节的问题
鲍菁答:(k<<1):K 左移一位,在最右边,腾出一个空位,内容是0。|sda:《或》引脚信号,即把总线的数据,写入空位。

13343756791:求解:IIC驱动程序中总线上为什么读取数据比写数据要多写一个字节的设 ...
鲍菁答:因为I2C在读数据的时候实际上是两次传输,第一次传输向设备发送需要读取的寄存器地址(实际的写操作),然后读取数据(实际的读操作);而写操作直接就是把寄存器地址和需要写进去的数据当做一次传输进行(实际的写操作)。可以用示波器看看数据线上的数据。

13343756791:51单片机如何模拟I2C总线中从机接收ID,发送数据的程序
鲍菁答:include define uchar unsigned char /*宏定义*/ define uint unsigned int /*端口位定义*/ sbit BELL_OUT=P3^5;sbit SCL="P1"^3;/*模拟I2C数据传送位*/ sbit SDA="P1"^4;/*模拟I2C时钟控制位*/ bit ack; /*应答标志位*/ / 起动总线函数 函数原型: void Start_I2c();功能...

13343756791:I2C总线字节传送与应答时数据传送格式是什么
鲍菁答:是这样的,I2C总线传送的是串行数据,数据的传送格式为:1)从master模块到slave模块(写的工作方式)时的数据传送格式start slave address R-W A DA TA A DA TA A stop 2)从slave模块到master模块(读的工作方式)时的数据传送格式start slave address R-W A DA TA A DA TA A...

13343756791:求51单片机大神指教IIC总线AT24C02使用。有某个地方不懂。//是关于开...
鲍菁答:write_add(2,sec); //这里是吧sec写入指定地址2里面,所以上面必须从地址2里面读取数据。if(sec>100) //若将此处去掉,则没有记忆功能。sec=0; // 这一块就是往I2C指定地址写入数值应该0 - 100数值,你把这里去掉了,没有往I2C写入数值你说能读出来数据吗还会有记忆功能吗。/ TH0=...

13343756791:求解51单片机I2C对24c02读写汇编程序
鲍菁答:INC DPTR ;准备下一个数据的地址 DJNZ R0,WriteNext ;判断16字节是否完成 CALL AT24C04_Stop ;停止信号 RET TESTDATA:DB 000H,011H,022H,033H,044H,055H,066H,077H DB 088H,099H,0AAH,0BBH,0CCH,0DDH,0EEH,0FFH ;;从AT24C04读取1页(16字节)数据 ;将设备的00~0F地址中的数...

13343756791:单片机送数?
鲍菁答:2 I2C总线传送方式特点 只需要使用2根线就可以完成数据传送 , 具体一点 你上面的DIO为数据传送总线,双向的,即可以写数据 也可以读数据 每次读写一位数据 连续读写8次 即可读写一个字节的数据。你上面的CLK为时钟同步控制信号,是作为读写数据的时序时钟使用的。3从上面时序看 ...

13343756791:51单片机如何模拟I2C总线中从机接收ID,发送数据的程序
鲍菁答:希望能给你解答:1、时钟信号都是主机产生的,从机只有一种情况下才能控制时钟线,即在忙的时候,主机还在发送数据,从机会主动把时钟拉低,表示我正在忙,不能收数据。2、两个主机的话,在发送的时候一定会有一个从属关系,这个需要自己设置。3、响应:i2c上每传输一个字节,都必须要有响应,方向是...

(编辑:本站网友)
相关推荐
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 百韵网