#include "Type.h"
#include "IIC.h"
#include "Delay.h"
void I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructer;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_2 | GPIO_Pin_3; //6--SCL 7--SDA
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructer);
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructer;
GPIO_InitStructer.GPIO_Pin= GPIO_Pin_2;
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructer);
}
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructer;
GPIO_InitStructer.GPIO_Pin= GPIO_Pin_2;
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructer);
}
void SDA_Set()
{
GPIOA->ODR |= GPIO_Pin_2;
}
void SDA_Reset()
{
GPIOA->ODR &= (u16)(~GPIO_Pin_2);
}
uint8 SDA_Get()
{
if(GPIOA->IDR&GPIO_Pin_2)
return 0x01;
else
return 0x00;
}
void SCL_Set()
{
GPIOA->ODR |= GPIO_Pin_3;
}
void SCL_Reset()
{
GPIOA->ODR &= (u16)(~GPIO_Pin_3);
}
void I2C_Start(void)
{
SDA_OUT();
SDA_Set();//SDA H
Delay_us();
SCL_Set();//SCL H
Delay_us();
SDA_Reset();//SDA L
Delay_us();
SCL_Reset();//SCL L
Delay_us();
} void I2C_Stop(void)
{
SDA_OUT();
SDA_Reset();//SDA L
Delay_us();
SCL_Set();//SCL H
Delay_us();
SDA_Set();//SDA H
Delay_us();
}
u8 I2C_Wait_Ask(void)
{
int count=;
SDA_IN();
SCL_Set();
Delay_us();
while(SDA_Get())
{
count++;
if(count>)
{
I2C_Stop();
return ;
}
Delay_us();
}
SCL_Reset();
Delay_us();
return ;
}
void I2C_WriteByte(u8 data)
{
u8 i;
SDA_OUT();
for(i=;i<;i++)
{
if(data & 0x80) //MSB,???????????
SDA_Set();
else
SDA_Reset();
Delay_us();
SCL_Set();
Delay_us();
SCL_Reset();
Delay_us();
data<<=;
}
}
u8 I2C_ReadByte(void)
{
u8 data,i;
data = ;
SDA_IN();
for(i=;i<;i++)
{
data<<=;
SCL_Set();
Delay_us();
if(SDA_Get())
data|=0x01;
SCL_Reset();
Delay_us();
}
return data;
}
#define WD_DEVICE_ADDR 0xA6 //ALT ½ÓµØÎªA6 ½ÓµçԴΪ3A
#define RD_DEVICE_ADDR 0xA7 //?????IIC???????,??ALT ADDRESS????????
void I2C_WriteData(uint8 addr, uint8 data)
{
I2C_Start();
I2C_WriteByte(WD_DEVICE_ADDR);//OLED??
if(I2C_Wait_Ask()==)
return ;
I2C_WriteByte(addr);//?????
if(I2C_Wait_Ask()==)
return ;
I2C_WriteByte(data);
I2C_Wait_Ask();
I2C_Stop();
}
uint8 I2C_ReadData(uint8 addr)
{
uint8 temp;
I2C_Start();
I2C_WriteByte(WD_DEVICE_ADDR);//OLED??
if(I2C_Wait_Ask()==)
return ;
I2C_WriteByte(addr);//?????
if(I2C_Wait_Ask()==)
return ; I2C_Start();
I2C_WriteByte(RD_DEVICE_ADDR);//OLED??
if(I2C_Wait_Ask()==)
return ;
temp = I2C_ReadByte();//?????
I2C_Stop();
return temp;
}
#ifndef __IIC_H__
#define __IIC_H__
#include "Type.h"
#include "stm32f10x.h" void I2C_Init(void);
void I2C_WriteData(uint8 addr, uint8 data);
uint8 I2C_ReadData(uint8 addr); #endif

STM32 IIC的更多相关文章

  1. STM32 IIC双机通信—— HAL库硬件IIC版

    参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HA ...

  2. stm32 iic读取mpu6050失败 改用串口

    mpu6050使用iic一直失败.放弃治疗,使用串口... #include "led.h" #include "mpu6050.h" #include &qu ...

  3. STM32—IIC通信(软件实现底层函数)

    使用GPIO引脚模拟SDA和SCL总线实现软件模拟IIC通信,IIC的具体通信协议层和物理层链接:IIC #ifndef __BSP_IIC_H #define __BSP_IIC_H #includ ...

  4. 半吊子的STM32 — IIC通信

    半双工通信模式:以字节模式发送(8位): 两线式串行总线,SDA(数据信号)和SCL(时钟信号)两条信号线都为高电平时,总线为空闲状态:起始时,SCL稳定为高电平,SDA电平由高向低跳变:停止时,SC ...

  5. 硬件实现IIC协议读取EEPROM

    我TMD也是服了,反正我板子搞了半天也不成功我也不知道为什么,野火STM32-MINI,一直卡EV5,不管了 先代码沾上 工程目录(板子为野火STM32 MINI) 串口相关代码: bsp_usart ...

  6. 基于I2C的AHT20温湿度传感器的数据采集

    关于:IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.它是由数据线SDA和时钟SCL构成的串行总线,可 ...

  7. stm32软件模拟IIC读取PX4FLOW光流传感器数据

    这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...

  8. STM32硬件IIC操作

    Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节 ...

  9. STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点

    近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...

随机推荐

  1. 关于pc端直播

    写这篇文章首先是想给自己一个总结.整理,还有就是给那些 没有特别明白直播是怎么回事的人一点 思路 最近公司想要做pc端直播,作为一个自认为很菜的前端实在是不知从何下手,所以只能用国人最爱的百度,搜索了 ...

  2. JsonResult类设置返回json的长度(工作笔记 json转化出错)

    public JsonResult PoundageReportSearch()         {    JsonResult jr = new JsonResult();        // 实例 ...

  3. BZOJ 3158: 千钧一发

    3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1201  Solved: 446[Submit][Status][Discuss ...

  4. Block 代码快

    1.原理 1.1block类型 a.全局bock块   贯彻整个程序 b.栈块  存在于栈内存中,作用域中使用 c.堆块  自行管理其内存 注*:http://blog.parse.com/learn ...

  5. Day10-线程进程

    什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程是程序的一次 ...

  6. BZOJ4516: [Sdoi2016]生成魔咒

    果然SA比SAM+map快~加了fread目前rank1. 首先这是SAM裸题,然而SA求本质不同子串个数也很容易.考虑倒着建SA,这样没错加一个字符就变成加一个后缀,其他后缀都不变,那么i的答案就是 ...

  7. python发送邮件

    python发送邮件(无附件) ======================================================= #!/usr/bin/env python#coding ...

  8. webapi6

  9. 基于fastweixin的微信开发环境搭建(一)

    由于公司业务需要,开发微信版本,才开始接触微信公众平台.在github折腾了几天,试过好几个微信sdk,最终选择fastweixin.个人觉得这个框架还是值得使用的,使用也简单.那么问题来了,很多人想 ...

  10. Struts2之开山篇

    ①Struts2是什么? Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图 ...