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|=<<;//先使能外设IO PORTC时钟
  5. GPIOC->CRH&=0XFFF00FFF;//PC11/12 推挽输出
  6. GPIOC->CRH|=0X00033000;
  7. GPIOC->ODR|=<<; //PC11,12 输出高
  8. }

IIC_Init

2.IIC

  1. //产生IIC起始信号
  2. void IIC_Start(void)
  3. {
  4. SDA_OUT(); //sda线输出
  5. IIC_SDA=;
  6. IIC_SCL=;
  7. delay_us();
  8. IIC_SDA=;//START:when CLK is high,DATA change form high to low
  9. delay_us();
  10. IIC_SCL=;//钳住I2C总线,准备发送或接收数据
  11. }
  12. //产生IIC停止信号
  13. void IIC_Stop(void)
  14. {
  15. SDA_OUT();//sda线输出
  16. IIC_SCL=;
  17. IIC_SDA=;
  18. delay_us();
  19. IIC_SCL=;//STOP:when CLK is high DATA change form low to high
  20. delay_us();
  21. IIC_SDA=;//发送I2C总线结束信号
  22. }
  23. //等待应答信号到来
  24. //返回值:1,接收应答失败
  25. // 0,接收应答成功
  26. u8 IIC_Wait_Ack(void)
  27. {
  28. u8 ucErrTime=;
  29. SDA_IN(); //SDA设置为输入
  30. IIC_SDA=;delay_us();
  31. IIC_SCL=;delay_us();
  32. while(READ_SDA)
  33. {
  34. ucErrTime++;
  35. if(ucErrTime>)
  36. {
  37. IIC_Stop();
  38. return ;
  39. }
  40. }
  41. IIC_SCL=;//时钟输出0
  42. return ;
  43. }
  44. //产生ACK应答
  45. void IIC_Ack(void)
  46. {
  47. IIC_SCL=;
  48. SDA_OUT();
  49. IIC_SDA=;
  50. delay_us();
  51. IIC_SCL=;
  52. delay_us();
  53. IIC_SCL=;
  54. }
  55. //不产生ACK应答
  56. void IIC_NAck(void)
  57. {
  58. IIC_SCL=;
  59. SDA_OUT();
  60. IIC_SDA=;
  61. delay_us();
  62. IIC_SCL=;
  63. delay_us();
  64. IIC_SCL=;
  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=;//拉低时钟开始数据传输
  10. for(t=;t<;t++)
  11. {
  12. IIC_SDA=(txd&0x80)>>;
  13. txd<<=;
  14. delay_us(); //对TEA5767这三个延时都是必须的
  15. IIC_SCL=;
  16. delay_us();
  17. IIC_SCL=;
  18. delay_us();
  19. }
  20. }
  21. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
  22. u8 IIC_Read_Byte(unsigned char ack)
  23. {
  24. unsigned char i,receive=;
  25. SDA_IN();//SDA设置为输入
  26. for(i=;i<;i++ )
  27. {
  28. IIC_SCL=;
  29. delay_us();
  30. IIC_SCL=;
  31. receive<<=;
  32. if(READ_SDA)receive++;
  33. delay_us();
  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

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

  1. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

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

    STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...

  3. stm32寄存器版学习笔记05 PWM

    STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...

  4. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  5. stm32寄存器版学习笔记08 DMA

    DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f10 ...

  6. stm32寄存器版学习笔记04 定时计数器中断

    STM32共有8个定时计数器,其中TIME1和TIME8是高级定时器,TIME2~TIME5是通用定时器,TIME6和TIME7是基本定时器.以TIME3为例总结定时计数器的基本用法. 1.TIM3的 ...

  7. stm32寄存器版学习笔记02 串口通信

    stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...

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

    STM32的I/O口可以由软件配置成如下8种模式:输入浮空.输入上拉.输入下拉.模拟输入.开漏输出.推挽输出.推挽式复用功能及开漏复用功能.每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CR ...

  9. stm32寄存器版学习笔记10 SPI

    SPI(Serial Peripheral Interface),串行外围设备接口.SPI是一种高速的.全双工.同步的通信总线. SPI接口一般使用4条线通信: MISO 主设备数据输入,从设备数据输 ...

随机推荐

  1. jquery实现全选/全不选

    //设置全选全不选$("#checkAll").click(function () { if ($("#checkAll").attr("checke ...

  2. 远程线程注入shellcode笔记

    #include "stdafx.h" #include <windows.h> #include <stdio.h> char shellcode[] = ...

  3. Linux 下的jdk安装

    Linux 下安装JDK1.8 https://www.cnblogs.com/xuliangxing/p/7066913.html http://www.oracle.com/technetwork ...

  4. linux 用 grep 查找单个或多个字符串(关键字)

    1.单个 cat /tmp/php.log | grep "成功" 所有的成功都会被查询出来. 2.多个,并列查询 cat /tmp/php.log | grep "推荐 ...

  5. 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型

    分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型   分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...

  6. 玲珑oj 1121 思维

    1121 - Reverse the lights Time Limit:2s Memory Limit:256MByte Submissions:376Solved:111 DESCRIPTION ...

  7. Check for Palindromes

    如果给定的字符串是回文,返回true,反之,返回false. 如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文). 注意你需要去掉字符串多 ...

  8. gzip压缩解压缩

    压缩/解压缩压缩/解压缩之后的文件名称 必须是gz 解压缩

  9. 剑指offer--51.表示数值的字符串

    正则好舒服, ------------------------------------------------------------------------------------------ 时间 ...

  10. New Concept English Two 33 94

    $课文92  自找麻烦 1016. It must have been about two in the morning when I returned home. 我回到家时,肯定已是凌晨两点左右了 ...