OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4420|回复: 2

IIC问题请教

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-7-20
在线时间
4 小时
发表于 2017-7-22 08:54:06 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 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();
}


最佳答案

查看完整内容[请看2#楼]

其实与或非这个我知道,涉及到IIC的操作,正确答案是最低位表示读写标志,读为1,写为0
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-7-20
在线时间
4 小时
 楼主| 发表于 2017-7-22 08:54:07 | 显示全部楼层
执迷 发表于 2017-7-22 09:24
看你问的都是按位&。|。你该先熟悉一下C。。&根据它的特性,一般可以用来位清零。|一般用来位置1

其实与或非这个我知道,涉及到IIC的操作,正确答案是最低位表示读写标志,读为1,写为0
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
发表于 2017-7-22 09:24:01 | 显示全部楼层
看你问的都是按位&。|。你该先熟悉一下C。。&根据它的特性,一般可以用来位清零。|一般用来位置1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-23 02:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表