stm32寄存器版学习笔记09 IIC

  I²C(Inter-Integrated Circuit)总线是一种两线式串行总线,用于连接微控制器及其外设,是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。 

  IIC总线在传送数据过程中共有3种类型信号,分别是开始信号、结束信号和应答信号。

 
SCL


SDA


开始信号


高电平


由高电平向低电平跳变,开始传送数据


结束信号


高电平


由低电平向高电平跳变,结束传送数据


应答信号


接收数据的IC在接收到8bit数据后向发送数据的IC发出特定的低电平脉冲,表示已经收到数据;CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断;若未收到应答信号,则判断为受控单元出现故障。

1.初始化IIC

1 //初始化IIC
2 void IIC_Init(void)
3 {
4      RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟
5     GPIOC->CRH&=0XFFF00FFF;//PC11/12 推挽输出
6     GPIOC->CRH|=0X00033000;
7     GPIOC->ODR|=3<<11;     //PC11,12 输出高
8 }

IIC_Init

2.IIC

 1 //产生IIC起始信号
 2 void IIC_Start(void)
 3 {
 4     SDA_OUT();     //sda线输出
 5     IIC_SDA=1;
 6     IIC_SCL=1;
 7     delay_us(4);
 8      IIC_SDA=0;//START:when CLK is high,DATA change form high to low
 9     delay_us(4);
10     IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
11 }
12 //产生IIC停止信号
13 void IIC_Stop(void)
14 {
15     SDA_OUT();//sda线输出
16     IIC_SCL=0;
17     IIC_SDA=0;
18      delay_us(4);
19     IIC_SCL=1;//STOP:when CLK is high DATA change form low to high
20      delay_us(4);
21     IIC_SDA=1;//发送I2C总线结束信号
22 }
23 //等待应答信号到来
24 //返回值:1,接收应答失败
25 //        0,接收应答成功
26 u8 IIC_Wait_Ack(void)
27 {
28     u8 ucErrTime=0;
29     SDA_IN();      //SDA设置为输入
30     IIC_SDA=1;delay_us(1);
31     IIC_SCL=1;delay_us(1);
32     while(READ_SDA)
33     {
34         ucErrTime++;
35         if(ucErrTime>250)
36         {
37             IIC_Stop();
38             return 1;
39         }
40     }
41     IIC_SCL=0;//时钟输出0
42     return 0;
43 }
44 //产生ACK应答
45 void IIC_Ack(void)
46 {
47     IIC_SCL=0;
48     SDA_OUT();
49     IIC_SDA=0;
50     delay_us(2);
51     IIC_SCL=1;
52     delay_us(2);
53     IIC_SCL=0;
54 }
55 //不产生ACK应答
56 void IIC_NAck(void)
57 {
58     IIC_SCL=0;
59     SDA_OUT();
60     IIC_SDA=1;
61     delay_us(2);
62     IIC_SCL=1;
63     delay_us(2);
64     IIC_SCL=0;
65 }

IIC信号

 1 //IIC发送一个字节
 2 //返回从机有无应答
 3 //1,有应答
 4 //0,无应答
 5 void IIC_Send_Byte(u8 txd)
 6 {
 7     u8 t;
 8     SDA_OUT();
 9     IIC_SCL=0;//拉低时钟开始数据传输
10     for(t=0;t<8;t++)
11     {
12         IIC_SDA=(txd&0x80)>>7;
13         txd<<=1;
14         delay_us(2);   //对TEA5767这三个延时都是必须的
15         IIC_SCL=1;
16         delay_us(2);
17         IIC_SCL=0;
18         delay_us(2);
19     }
20 }
21 //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
22 u8 IIC_Read_Byte(unsigned char ack)
23 {
24     unsigned char i,receive=0;
25     SDA_IN();//SDA设置为输入
26     for(i=0;i<8;i++ )
27     {
28         IIC_SCL=0;
29         delay_us(2);
30         IIC_SCL=1;
31         receive<<=1;
32         if(READ_SDA)receive++;
33         delay_us(1);
34     }
35     if (!ack)
36         IIC_NAck();//发送nACK
37     else
38         IIC_Ack(); //发送ACK
39     return receive;
40 }

Send Read

1 //IO方向设置
2 #define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
3 #define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}
4
5 //IO操作函数
6 #define IIC_SCL    PCout(12) //SCL
7 #define IIC_SDA    PCout(11) //SDA
8 #define READ_SDA   PCin(11)  //输入SDA 

IIC.h

时间: 2024-10-14 05:25:11

stm32寄存器版学习笔记09 IIC的相关文章

stm32寄存器版学习笔记07 ADC

STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把ADC转换分成2个通道组:规则通道组相当于正常运行的程序:注入通道组相当于中断.程序初始化阶段设置好不同的转换组,系统运行中不用变更循环转换的配置,从而达到任务互不干扰和快速切换. 有16个多路通道.可以把转换组织成两组:规则组和注入组.在任意多个通道上以任意顺序进行的一系列转换构成成组转换.例如,可

stm32寄存器版学习笔记05 PWM

STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟,配置PA8为复用输出 APB2外设时钟使能寄存器(RCC_APB2ENR) APB1外设复位寄存器 (RCC_APB1RSTR) 置1开启.清0关闭. Eg:RCC->APB2ENR|=1<<11; //使能TIM1时钟 配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置

stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启TIM2时钟,配置PA0输入 APB1外设复位寄存器 (RCC_APB1RSTR) APB2外设时钟使能寄存器(RCC_APB2ENR) 置1开启.清0关闭. Eg:RCC->APB1ENR|=1<<0; //使能TIM2时钟  RCC->APB2ENR|=1<<2;  

stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)

STM32的I/O口可以由软件配置成如下8种模式:输入浮空.输入上拉.输入下拉.模拟输入.开漏输出.推挽输出.推挽式复用功能及开漏复用功能.每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CRL和CRH(模式.速度):数据寄存器IDR和ODR:置位/复位寄存器BSRR:复位寄存器BRR:锁存寄存器LCKR. I/O口模式: GPIO的8种模式 通用输出 推挽输出(Puch-Pull) 可以输出高.低电平,连接数字器件   开漏输出(Open-Drain) 开漏引脚不连接外部的上拉电阻时,

stm32寄存器版学习笔记08 DMA

DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f103有2个DMA控制器,DMA1有7个通道,DMA2有5个通道,专门用来管理来自外设对存储器的访问请求,还有一个仲裁器来协调各个DMA请求的优先权. 1.DMA各通道请求 从外设产生的DMA请求通过逻辑"或"输入到DMA控制器,这就意味着同时只能有一个请求有效. 例如,串口1发送的DMA,就

stm32寄存器版学习笔记10 SPI

SPI(Serial Peripheral Interface),串行外围设备接口.SPI是一种高速的.全双工.同步的通信总线. SPI接口一般使用4条线通信: MISO 主设备数据输入,从设备数据输出 MOSI 主设备数据输出,从设备数据输入 SCLK 时钟信号,有主设备产生 CS 从设备片选信号,有主设备控制 SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置.SPI_CR寄存器的CPOL(时钟极性)位,控制在没有数据传输时时钟的空闲状态电平,此位对

C++Primer第5版学习笔记(三)

C++Primer第5版学习笔记(三) 第四/五章的重难点内容 你可以点击这里回顾第三章内容 因为第五章的内容比较少,因此和第四章的笔记内容合并.   第四章是和表达式有关的知识,表达式是C++的基础设施,本章由三部分组成:         1.表达式概念基础,包括表达式的基本概念,左值和右值的概念,优先级结合律,求值顺序.  2.各种运算符,主要包括算数\关系\逻辑\赋值\递增递减\成员访问\条件\位运算\sizeof\逗号运算符 这10种运算符.  3.类型转换,包括隐式和显式两种转换的规则

《机电传动控制》学习笔记09

<机电传动控制>学习笔记09 胡恒谦 机卓1301 1. 电力电子器件 电力电子器件根据其导通和关断可控性的不同可以分为以下三类. (1)不可控型器件,即导通与关断都不能控制的器件.仅整流二极管是不可控器件. (2)半控型器件,即只能控制其导通,不能控制其关断的器件.普通晶闸管SCR及其派生器件属于半控型器件. (3)全控型器件,即导通与关断都可以控制的器件.GTR.GTO.IGBT等都属于全控型器件. 2. 晶闸管 晶闸管导通条件为:加正向电压且门极有触发电流:其派生器件有:快速晶闸管,双向

C++Primer第5版学习笔记(一)

C++Primer第5版学习笔记(一) 第一.二章的重难点内容 本篇文章主要记录了我在学习C++Primer(第5版,中文版)中遇到的重难点及其分析.因为第一.二章比较简单,因此这里合并这两章我遇到的问题.        第一章 开始 这一章在第一部分之前,是一个helloworld式的章节,包含基本的函数,io流以及类的介绍. 知识点1:P19,1.5,文件重定向 可以在windows下的cmd中或者mac,linux系统的终端窗口中用输入命令的形式执行程序并使它从一个文件中读入数据,再把标准