发 帖  
原厂入驻New
IIC分配所需的传送BD和接收BD中的BD是什么?
173 IIC
分享
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();
}
0
2020-3-19 04:35:20   评论 分享淘帖 邀请回答
2个回答
其实与或非这个我知道,涉及到IIC的操作,正确答案是最低位表示读写标志,读为1,写为0
2020-3-19 09:07:57 评论

举报

看你问的都是按位&。|。你该先熟悉一下C。。&根据它的特性,一般可以用来位清零。|一般用来位置1
2020-3-19 09:17:56 评论

举报

只有小组成员才能发言,加入小组>>

1017个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

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