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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版