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激光测距而已.网上 ...
随机推荐
- java面向对象---对象初始化
在本地变量中,如果定义了一个变量后没有赋值就使用,那么eclipse就会报错:但是在成员变量中,java是会强制给一个没有初始化的变量一个默认的初始值0, 如果是一个boolean类型的变量,那么默认 ...
- NTFS交换数据流隐写的应用
by Chesky ##目录 ####一.NTFS交换数据流(ADS)简介 ####二.ADS应用 写入隐藏文件(文本\图像\可执行文件) ADS在Windows平台下的利用--写入后门 ADS在We ...
- 分页(thinkphp5.0版本)
一.简洁分页(不含页码,只能翻阅上下页) 控制器部分代码: $pagesize=15;//每页显示15条数据 $data = Db::name('db')->where(array('key'= ...
- Jmeter插件监控服务器性能
处理利用jmeter实施监控压测时受压机的各项性能 操作步骤: 施压机上的jmeter/lib/ext中放入下载的插件包 jmeter-plugins-perfmon-2.1.jar 受压机上放入Se ...
- Bubble Cup 8 finals I. Robots protection (575I)
题意: 有一个正方形区域, 要求支持两个操作: 1.放置三角形,给定放置方向(有4个方向,直角边与坐标轴平行),直角顶点坐标,边长 2.查询一个点被覆盖了多少次 1<=正方形区域边长n<= ...
- hibernate学习二(HelloWorld)
一.建立hibernate配置文件 在工程Hibernate_01_HelloWorld下的src上建立hibernate.cfg.xml,打开hibernate-release-4.3.11.Fin ...
- Codeforces Round #352 (Div. 2) ABCD
Problems # Name A Summer Camp standard input/output 1 s, 256 MB x3197 B Different is Good ...
- SIP学习笔记(转)
本文转发自:http://blog.chinaunix.net/uid-20655530-id-1589483.html 学习 SIP 协议最快捷的方法是通过范例来学习, 找到了一个完整的呼叫流程,l ...
- GNU Radio Radar Toolbox
GNU Radio Radar Toolbox Install guide Change to any folder in your home directory and enter followin ...
- java文件上传
jsp界面代码: <body> <form action="servlet/UploadServlet" enctype="multipart/for ...