OpenEdv-开源电子网
标题:
IIC问题请教
[打印本页]
作者:
baoeraiqingcai
时间:
2017-7-22 08:54
标题:
IIC问题请教
本帖最后由 baoeraiqingcai 于 2017-7-22 09:01 编辑
1:分配所需的传送BD和接收BD中的BD是什么意思?
2、/*****************************************************************************/
/*函 数 名:I2C_Word_Write */
/*功能描述:I2C按WORD写操作 */
/*函数说明: */
/*调用函数:I2C_Start()、I2C_Senddata()、I2C_Ack()、I2C_Stop() */
/*全局变量:无 */
/*输 入:uchar device_address, uchar reg_add, uint writeword */
/*返 回:无 */
/*设 计 者: 时间: */
/*修 改 者: 时间: */
/*版 本: */
/*****************************************************************************/
void I2C_Word_Write(UINT8 device_address, UINT8 reg_add, UINT16 writeword)
{
UINT8 writeword_high,writeword_low;
writeword_low = writeword;
writeword_high = writeword>>8;
I2C_Start() I2C_Senddata(device_address & 0xFE);//为什么要&0xfe?
I2C_Ack();
if (Ack_Flag == 0)
{
I2C_Senddata(reg_add);
I2C_Ack();
if (Ack_Flag == 0)
{
I2C_Senddata(writeword_high);
I2C_Ack();
if (Ack_Flag == 0)
{
I2C_Senddata(writeword_low);
I2C_Ack();
}
else
SCL = 0;
}
else
SCL = 0;
}
else
SCL = 0;
I2C_Stop();
}
/*****************************************************************************/
/*函 数 名:I2C_Word_Read */
/*功能描述:I2C按Word读操作 */
/*函数说明: */
/*调用函数:I2C_Start()、I2C_Senddata()、I2C_Ack()、 */
/* I2C_Receivedata()、I2C_Stop() */
/*全局变量:无 */
/*输 入:uchar device_address,uchar reg_add */
/*返 回:正确:uchar readdata 错误:0x0000 */
/*设 计 者: 时间: */
/*修 改 者: 时间: */
/*版 本: */
/*****************************************************************************/
UINT16 I2C_Word_Read(UINT8 device_address, UINT8 reg_add)
{
UINT8 readdata_low;
UINT16 readdata,readdata_high,temp=0;
I2C_Start();
I2C_Senddata(device_address & 0xFE);//为什么要&0xfe?
I2C_Ack();
if (Ack_Flag == 0)
{
I2C_Senddata(reg_add);
I2C_Ack();
if (Ack_Flag == 0)
{
I2C_Start();
I2C_Senddata(device_address | 0x01);//这句话是什么意思
I2C_Ack();
if (Ack_Flag == 0)
{
// SDA = 1;//SDA 设为输入,读引脚
readdata_high = I2C_Receivedata();
SDA = 0;
I2C_Delay();I2C_Delay();
SCL = 1;
I2C_Delay();I2C_Delay();
SCL = 0;
I2C_Delay();I2C_Delay();
SDA = 1;
if (Ack_Flag == 0)
{
readdata_low = I2C_Receivedata();
I2C_Ack();
I2C_Stop();
temp = readdata_high << 8;
readdata = temp | readdata_low;
return(readdata);
}
else
{
I2C_Stop();
return(0x0000);
}
}
else
{
I2C_Stop();
return(0x0000);
}
}
else
{
I2C_Stop();
return(0x0000);
}
}
else
{
I2C_Stop();
return(0x0000);
}
}
void I2C_Senddata(UINT8 senddata)
{
UINT8 i;
for (i=0;i<8;i++)
{
I2C_Delay();
if ((senddata & 0x80) != 0x80) //这句话什么意思?
SDA = 0;
else
SDA = 1;
senddata = senddata << 1;
I2C_Delay();
SCL = 1;
I2C_Delay();
SCL = 0;
}
I2C_Delay();
}
作者:
baoeraiqingcai
时间:
2017-7-22 08:54
执迷 发表于 2017-7-22 09:24
看你问的都是按位&。|。你该先熟悉一下C。。&根据它的特性,一般可以用来位清零。|一般用来位置1
其实与或非这个我知道,涉及到IIC的操作,正确答案是最低位表示读写标志,读为1,写为0
作者:
执迷
时间:
2017-7-22 09:24
看你问的都是按位&。|。你该先熟悉一下C。。&根据它的特性,一般可以用来位清零。|一般用来位置1
欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/)
Powered by Discuz! X3.4