你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

GPIO模拟I2C 不通 求拍砖

[复制链接]
beary 提问时间:2015-9-22 13:57 /
#####################################################
i2c.h
#####################################################
#ifndef _I2C_H_
#define _I2C_H_
#include "stdbool.h"
#include "stm32f4xx_hal.h"

#define u8 uint8_t
#define u16 uint16_t

#define add_w 0x90
#define add_r 0x91
#define SDA_H GPIOB->BSRR=GPIO_PIN_8
#define SDA_L GPIOB->BSRR=(uint32_t)GPIO_PIN_8 << 16

#define SCL_H GPIOB->BSRR=GPIO_PIN_9
#define SCL_L GPIOB->BSRR=(uint32_t)GPIO_PIN_9 << 16

#define SDA_READ GPIOB->IDR& GPIO_PIN_8
#define SCL_READ GPIOB->IDR& GPIO_PIN_9

void writebyte(u8 sendbyte,u16 write_add,u8 device_add);
bool readbyte(u8* pBuffer,u8 length,u16 read_add,u8 device_add);



#######################################
i2c.c
######################################
#include "i2c.h"
void i2c_delay()
{
        u8 i = 100;
        while(i--);
}

bool i2c_start(void)
{
        SDA_H;
        SCL_H;
        i2c_delay();
       
        if(!SDA_READ)//test the sda != 0
                return false;
       
        SDA_L;
        i2c_delay();
       
        if(SDA_READ)//test the sda == 0
                return false;
       
        SCL_L;
        i2c_delay();
        return true;
}

void i2c_stop(void)
{
        //scl == 0, and sda == 0
        SCL_L;
        i2c_delay();
        SDA_L;
        i2c_delay();
        //scl = 1 , then sda = 1
        SCL_H;
        i2c_delay();
        SDA_H;
        i2c_delay();
}

void i2c_ack(void)
{
        SDA_H;
        i2c_delay();
        SCL_H;
        i2c_delay();
        SCL_L;
        i2c_delay();
        SDA_L;
        i2c_delay();
        SCL_H;
        i2c_delay();
       
}

bool i2c_waitack(void)
{
        SCL_L;
        i2c_delay();
        SDA_H;
        i2c_delay();
        SCL_H;
        i2c_delay();
        if(SDA_READ)
        {
                SCL_L;
                return false;
        }
        SCL_L;
        return true;
}

void i2c_sendbyte(u8 send)
{
        u8 i = 8;
        while(i--)
        {
                SCL_L;
                i2c_delay();
                if(send&0x80)
                        SDA_H;
                else
                        SDA_L;
                send <<= 1;
                i2c_delay();
                SCL_H;
                i2c_delay();
        }
        SCL_L;
}

u8 receivebyte(void)
{
        u8 i = 8;
        u8 receive = 0;
        SDA_H;
        while(i--)
        {
                receive<<=1;
                SCL_L;
                i2c_delay();
                SCL_H;
                i2c_delay();
                if(SDA_READ)
                {
                        receive |= 0x01;
                }
        }
        SCL_L;
        return receive;
}



void writebyte(u8 sendbyte,u16 write_add,u8 device_add)
{
        device_add = device_add | 0x00;
        i2c_start();
        i2c_sendbyte(device_add);
        i2c_delay();
        i2c_sendbyte(write_add);
        i2c_delay();
        i2c_sendbyte(sendbyte);
        i2c_delay();
        i2c_stop();
}

bool readbyte(u8* pBuffer,u8 length,u16 read_add,u8 device_add)
{
        device_add = device_add | 0x01;
        if(!i2c_start())
                return false;
        i2c_sendbyte(device_add);
        i2c_delay();
        i2c_sendbyte(read_add-1);
        i2c_delay();
        i2c_sendbyte(*pBuffer);
        i2c_delay();
        i2c_ack();
        i2c_delay();
        i2c_stop();
        return true;
}

收藏 评论5 发布时间:2015-9-22 13:57

举报

5个回答
此名已占用 回答时间:2015-9-22 16:09:03
延时时间不够
党国特派员 回答时间:2015-9-22 17:34:49
用逻辑分析仪看下就明白了。
anger0925 回答时间:2015-9-22 18:57:32
注意时序,我好几年前调通过,找到可以发给你参考
112207301219 回答时间:2015-9-22 20:26:40
用示波器看看
chifen 回答时间:2015-9-22 22:33:28
SDA的 IO推动方式 ,最好用开漏型,脚上接个上拉电阻试试

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版