I2C软件模拟代码

#ifndef __MYI2C_H__
#define __MTI2C_H__
#include "main.h"
#include "gpio.h"
void MyI2C_SDA_W(uint8_t State);
uint8_t MyI2C_SDA_R(void);
void MyI2C_SCL_W(uint8_t State);
void MyI2C_Strat(void);
void MyI2C_Finish(void);
void MYI2C_SendByte( uint8_t i);
uint8_t MYI2C_ReadByte(void);
void MYI2C_SendACK(void);
uint8_t MYI2C_ReceiveACK(void);
#endif
#include "myi2c.h"

void MyI2C_SDA_W( uint8_t State)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,(GPIO_PinState)State);
    
}
uint8_t MyI2C_SDA_R(void)
{
    uint8_t Binaction;
    Binaction=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8);
  
    return Binaction; 
}
void MyI2C_SCL_W(uint8_t State)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,(GPIO_PinState)State);
    
}
void MyI2C_Strat(void)
{
    MyI2C_SDA_W(1);
    MyI2C_SCL_W(1);
    MyI2C_SDA_W(0);
    MyI2C_SCL_W(0);//I2C起始条件为先将SDA拉低,再拉低SCL,即高电平改变SDA状态位
}
void MyI2C_Finish(void)
{
    MyI2C_SDA_W(0);
    MyI2C_SCL_W(1);
    MyI2C_SDA_W(1);//最后都将SDA和SCL拉高,为下一次开始通信做准备

}
void MYI2C_SendByte( uint8_t i)
{
   
    //高位先行
    //从初始化开始考虑循环代码
    for(uint8_t j=0;j<8;j++)
    {

        MyI2C_SDA_W(i & (0x80>>j));//初始化之后为低电平,低电平 写
        MyI2C_SCL_W(1);            //写完成后电平拉高
        MyI2C_SCL_W(0);            //拉高之后再拉底,为下一次写做准备
    }

}
uint8_t MYI2C_ReadByte(void)
{
   uint8_t i=0x00;//在每次进行字节操作之前,SCL一定处于低电平,此时主机要对SDA进行放手操作
   MyI2C_SDA_W(1);
   for(uint8_t j=7;j>=0;j--)
   {
    MyI2C_SCL_W(1);
    i|=MyI2C_SDA_R()<<j;//!!可能存在的问题:MYI2C_SDA_R的返回值为枚举型变量,不确定其是否返回至8位字节中的某一位
    MyI2C_SCL_W(0);
   }
   return i;
}
void MYI2C_SendACK(void)
{
    MyI2C_SDA_W(0);
    MyI2C_SCL_W(1);
    MyI2C_SCL_W(0);
}
uint8_t MYI2C_ReceiveACK(void)
{
    uint8_t i;
    MyI2C_SDA_W(1);//在将SDA交给从机操作时,要先确保主机释放SDA
    MyI2C_SCL_W(1);
   i =  MyI2C_SDA_R();
   MyI2C_SCL_W(0);
   return i;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值