野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12956|回复: 4

I2C 模拟通讯 数据的方向有必要从新定义一遍吗

[复制链接]
发表于 2016-12-21 13:31:35 | 显示全部楼层 |阅读模式
如题,在开发板中的例程发现i2c的通讯 没有关于操作数据 方向没有
但是别人给的好像有方向
回复

使用道具 举报

发表于 2016-12-21 13:51:05 | 显示全部楼层
读和写不就是两个方向吗?例程里的i2c驱动肯定都有读和写
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-21 13:59:14 | 显示全部楼层
flyleaf 发表于 2016-12-21 13:51
读和写不就是两个方向吗?例程里的i2c驱动肯定都有读和写

#define I2C_SDA_READ()  GPIO_ReadInputDataBit(GPIO_PORT_I2C, I2C_SDA_PIN)        /* 读SDA口线状态 */

只有读的这个定义, 没有写的?
回复 支持 反对

使用道具 举报

发表于 2016-12-24 14:09:22 | 显示全部楼层
你贴出来的这个是读SDA的电平变化及应答的,如果读到符合收发数据的条件则收发数据,而要收发数据是要写出以下代码(当然前提是要找到设备,看设备有无应答,然后在收发):*********************************************************************************************************
*        函 数 名: i2c_SendByte
*        功能说明: CPU向I2C总线设备发送8bit数据
*        形    参:_ucByte : 等待发送的字节
*        返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(uint8_t _ucByte)
{
        uint8_t i;

        /* 先发送字节的高位bit7 */
        for (i = 0; i < 8; i++)
        {               
                if (_ucByte & 0x80)
                {
                        macI2C_SDA_1();
                }
                else
                {
                        macI2C_SDA_0();
                }
                i2c_Delay();
                macI2C_SCL_1();
                i2c_Delay();       
                macI2C_SCL_0();
                if (i == 7)
                {
                         macI2C_SDA_1(); // 释放总线
                }
                _ucByte <<= 1;        /* 左移一个bit */
                i2c_Delay();
        }
}

/*
*********************************************************************************************************
*        函 数 名: i2c_ReadByte
*        功能说明: CPU从I2C总线设备读取8bit数据
*        形    参:无
*        返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(void)
{
        uint8_t i;
        uint8_t value;

        /* 读到第1个bit为数据的bit7 */
        value = 0;
        for (i = 0; i < 8; i++)
        {
                value <<= 1;
                macI2C_SCL_1();
                i2c_Delay();
                if (macI2C_SDA_READ())
                {
                        value++;
                }
                macI2C_SCL_0();
                i2c_Delay();
        }
        return value;
}

/*
*********************************************************************************************************
*        函 数 名: i2c_WaitAck
*        功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
*        形    参:无
*        返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{
        uint8_t re;

        macI2C_SDA_1();        /* CPU释放SDA总线 */
        i2c_Delay();
        macI2C_SCL_1();        /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
        i2c_Delay();
        if (macI2C_SDA_READ())        /* CPU读取SDA口线状态 */
        {
                re = 1;
        }
        else
        {
                re = 0;
        }
        macI2C_SCL_0();
        i2c_Delay();
        return re;
}



裸机例程有的
回复 支持 反对

使用道具 举报

发表于 2016-12-24 14:10:56 | 显示全部楼层
还有就是你发送设备地址时的最低位就是数据方向,0是写,1是读
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-13 22:38 , Processed in 0.048710 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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