STM32 IIC
#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的更多相关文章
- STM32 IIC双机通信—— HAL库硬件IIC版
参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HA ...
- stm32 iic读取mpu6050失败 改用串口
mpu6050使用iic一直失败.放弃治疗,使用串口... #include "led.h" #include "mpu6050.h" #include &qu ...
- STM32—IIC通信(软件实现底层函数)
使用GPIO引脚模拟SDA和SCL总线实现软件模拟IIC通信,IIC的具体通信协议层和物理层链接:IIC #ifndef __BSP_IIC_H #define __BSP_IIC_H #includ ...
- 半吊子的STM32 — IIC通信
半双工通信模式:以字节模式发送(8位): 两线式串行总线,SDA(数据信号)和SCL(时钟信号)两条信号线都为高电平时,总线为空闲状态:起始时,SCL稳定为高电平,SDA电平由高向低跳变:停止时,SC ...
- 硬件实现IIC协议读取EEPROM
我TMD也是服了,反正我板子搞了半天也不成功我也不知道为什么,野火STM32-MINI,一直卡EV5,不管了 先代码沾上 工程目录(板子为野火STM32 MINI) 串口相关代码: bsp_usart ...
- 基于I2C的AHT20温湿度传感器的数据采集
关于:IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.它是由数据线SDA和时钟SCL构成的串行总线,可 ...
- stm32软件模拟IIC读取PX4FLOW光流传感器数据
这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...
- STM32硬件IIC操作
Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节 ...
- STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点
近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...
随机推荐
- 进度条投票-W
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- BZOJ 4726: [POI2017]Sabota?
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 301 Solved ...
- OI省选算法汇总
copy from hzwer @http://hzwer.com/1234.html 侵删 1.1 基本数据结构 1. 数组 2. 链表,双向链表 3. 队列,单调队列,双端队列 4. 栈,单调栈 ...
- <Script>放置位置
html文件是自上而下的执行方式 css引入执行加载时,程序仍然往下执行 script脚本是则中断线程,待该script脚本执行结束之后程序才继续往下执行 页面效果实现类的js放在body之前,动作, ...
- DOM解析XML报错:Content is not allowed in prolog
报错内容为: Content is not allowed in prolog. Nested exception: Content is not allowed in prolog. 网上所述总结来 ...
- phpcms首页实现轮播图
1.在你想要加轮播图的位置加入以下 <div id="flowDiagram" > <div id="button"> <span ...
- linux 系统、命令、软件
软件名称:Putty 使用方法:http://jingyan.baidu.com/article/e73e26c0eb063324adb6a737.html 需要资料: 服务IP:228.5624.5 ...
- remove name="ProxyModule“会导致重复执行
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访 ...
- ORACLE 常见错误
ora-00904 : 标识符无效:查询语句中的列或表在oracle 中不存在:
- 关于PHP的引用赋值
应用赋值,可以改变之前的变量的值! 可以间接的做到,在变量未申明的时候!就可以获取它的值!