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激光测距而已.网上 ...
随机推荐
- 用MySQL语法建 一个学生表,包括学生姓名、性别、年龄、班级信息。
(1)创建表的SQL语句 create table student ( ID int primary key not null, NAME varchar(50), sex int, age int, ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- JavaScript系列文章:自动类型转换
我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...
- 将文件移出版本控制 (Revision Control)
两条重要的 Git 命令: git rm -r -n --cached /path/to/the/directory git rm -r --cached /path/to/the/directory ...
- strncpy函数使用
strncpy()函数原型:extern char *strncpy(char *dest, char *src, int n); 用法:#include <string.h> ...
- 了解PHP中的register_shutdown_funcion
(PHP 4, PHP 5, PHP 7) register_shutdown_function - Register a function for execution on shutdown 执行P ...
- 解决SmartGit序列号问题
SmartGit过了30天试用期之后,就需要用户输入序列号才能继续使用,有一个办法可以跳过输入序列号. 一.windows+R 输入:%APPDATA%\syntevo\SmartGit 二.打开7 ...
- JMeter 集合点
JMeter也有像LR中的集合点,本篇就来介绍下JMeter的集合点如何去实现. JMeter里面的集合点通过添加定时器来完成. 注意:集合点的位置一定要在Sample之前. 集合点:简单来理解一下, ...
- web.config SetAttributes
<appSettings> <add key="DomainProxy" value="http://e3api.lcsyzx.cn/api/" ...
- centos7安装svn1.8.16
svn下载地址:http://subversion.apache.org/download/ svn要依赖一些包,可以提前装好 yum -y install apr-util apr-util-dev ...