stm32寄存器版学习笔记09 IIC
I²C(Inter-Integrated Circuit)总线是一种两线式串行总线,用于连接微控制器及其外设,是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
IIC总线在传送数据过程中共有3种类型信号,分别是开始信号、结束信号和应答信号。
SCL |
SDA |
|
开始信号 |
高电平 |
由高电平向低电平跳变,开始传送数据 |
结束信号 |
高电平 |
由低电平向高电平跳变,结束传送数据 |
应答信号 |
接收数据的IC在接收到8bit数据后向发送数据的IC发出特定的低电平脉冲,表示已经收到数据;CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断;若未收到应答信号,则判断为受控单元出现故障。 |
1.初始化IIC
- //初始化IIC
- void IIC_Init(void)
- {
- RCC->APB2ENR|=<<;//先使能外设IO PORTC时钟
- GPIOC->CRH&=0XFFF00FFF;//PC11/12 推挽输出
- GPIOC->CRH|=0X00033000;
- GPIOC->ODR|=<<; //PC11,12 输出高
- }
IIC_Init
2.IIC
- //产生IIC起始信号
- void IIC_Start(void)
- {
- SDA_OUT(); //sda线输出
- IIC_SDA=;
- IIC_SCL=;
- delay_us();
- IIC_SDA=;//START:when CLK is high,DATA change form high to low
- delay_us();
- IIC_SCL=;//钳住I2C总线,准备发送或接收数据
- }
- //产生IIC停止信号
- void IIC_Stop(void)
- {
- SDA_OUT();//sda线输出
- IIC_SCL=;
- IIC_SDA=;
- delay_us();
- IIC_SCL=;//STOP:when CLK is high DATA change form low to high
- delay_us();
- IIC_SDA=;//发送I2C总线结束信号
- }
- //等待应答信号到来
- //返回值:1,接收应答失败
- // 0,接收应答成功
- u8 IIC_Wait_Ack(void)
- {
- u8 ucErrTime=;
- SDA_IN(); //SDA设置为输入
- IIC_SDA=;delay_us();
- IIC_SCL=;delay_us();
- while(READ_SDA)
- {
- ucErrTime++;
- if(ucErrTime>)
- {
- IIC_Stop();
- return ;
- }
- }
- IIC_SCL=;//时钟输出0
- return ;
- }
- //产生ACK应答
- void IIC_Ack(void)
- {
- IIC_SCL=;
- SDA_OUT();
- IIC_SDA=;
- delay_us();
- IIC_SCL=;
- delay_us();
- IIC_SCL=;
- }
- //不产生ACK应答
- void IIC_NAck(void)
- {
- IIC_SCL=;
- SDA_OUT();
- IIC_SDA=;
- delay_us();
- IIC_SCL=;
- delay_us();
- IIC_SCL=;
- }
IIC信号
- //IIC发送一个字节
- //返回从机有无应答
- //1,有应答
- //0,无应答
- void IIC_Send_Byte(u8 txd)
- {
- u8 t;
- SDA_OUT();
- IIC_SCL=;//拉低时钟开始数据传输
- for(t=;t<;t++)
- {
- IIC_SDA=(txd&0x80)>>;
- txd<<=;
- delay_us(); //对TEA5767这三个延时都是必须的
- IIC_SCL=;
- delay_us();
- IIC_SCL=;
- delay_us();
- }
- }
- //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
- u8 IIC_Read_Byte(unsigned char ack)
- {
- unsigned char i,receive=;
- SDA_IN();//SDA设置为输入
- for(i=;i<;i++ )
- {
- IIC_SCL=;
- delay_us();
- IIC_SCL=;
- receive<<=;
- if(READ_SDA)receive++;
- delay_us();
- }
- if (!ack)
- IIC_NAck();//发送nACK
- else
- IIC_Ack(); //发送ACK
- return receive;
- }
Send Read
- //IO方向设置
- #define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
- #define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}
- //IO操作函数
- #define IIC_SCL PCout(12) //SCL
- #define IIC_SDA PCout(11) //SDA
- #define READ_SDA PCin(11) //输入SDA
IIC.h
stm32寄存器版学习笔记09 IIC的更多相关文章
- stm32寄存器版学习笔记07 ADC
STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...
- stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)
STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...
- stm32寄存器版学习笔记05 PWM
STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...
- stm32寄存器版学习笔记03 外部中断
stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...
- stm32寄存器版学习笔记08 DMA
DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f10 ...
- stm32寄存器版学习笔记04 定时计数器中断
STM32共有8个定时计数器,其中TIME1和TIME8是高级定时器,TIME2~TIME5是通用定时器,TIME6和TIME7是基本定时器.以TIME3为例总结定时计数器的基本用法. 1.TIM3的 ...
- stm32寄存器版学习笔记02 串口通信
stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...
- stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)
STM32的I/O口可以由软件配置成如下8种模式:输入浮空.输入上拉.输入下拉.模拟输入.开漏输出.推挽输出.推挽式复用功能及开漏复用功能.每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CR ...
- stm32寄存器版学习笔记10 SPI
SPI(Serial Peripheral Interface),串行外围设备接口.SPI是一种高速的.全双工.同步的通信总线. SPI接口一般使用4条线通信: MISO 主设备数据输入,从设备数据输 ...
随机推荐
- jquery实现全选/全不选
//设置全选全不选$("#checkAll").click(function () { if ($("#checkAll").attr("checke ...
- 远程线程注入shellcode笔记
#include "stdafx.h" #include <windows.h> #include <stdio.h> char shellcode[] = ...
- Linux 下的jdk安装
Linux 下安装JDK1.8 https://www.cnblogs.com/xuliangxing/p/7066913.html http://www.oracle.com/technetwork ...
- linux 用 grep 查找单个或多个字符串(关键字)
1.单个 cat /tmp/php.log | grep "成功" 所有的成功都会被查询出来. 2.多个,并列查询 cat /tmp/php.log | grep "推荐 ...
- 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型
分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型 分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...
- 玲珑oj 1121 思维
1121 - Reverse the lights Time Limit:2s Memory Limit:256MByte Submissions:376Solved:111 DESCRIPTION ...
- Check for Palindromes
如果给定的字符串是回文,返回true,反之,返回false. 如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文). 注意你需要去掉字符串多 ...
- gzip压缩解压缩
压缩/解压缩压缩/解压缩之后的文件名称 必须是gz 解压缩
- 剑指offer--51.表示数值的字符串
正则好舒服, ------------------------------------------------------------------------------------------ 时间 ...
- New Concept English Two 33 94
$课文92 自找麻烦 1016. It must have been about two in the morning when I returned home. 我回到家时,肯定已是凌晨两点左右了 ...