• I2C外设


    I2C的总结

    I2C优点:

    接口线少只有两根线,控制方式简单,通信速率较高;

    I2C 是飞利浦公司开发的两线式串行总线

    I2C缺点:

    硬件比较复杂,稳定性不太好,程序移植有点麻烦,用软件模拟I2C比较方便

    物理层特点:

    (1)支持多设备的总线

    (2)一个总线只使用两根线,数据线SDA,时钟线SCL

    (3)每个连接总线都设备都有一个独立的地址,查询设备都是靠这个地址

    (4)总线通过上拉电阻,空闲的时候就输出高阻态,所有设备空间的时候,会拉成高电平

    (5)多个主机同时使用总线的时候,就会使用仲裁

    (6)总线传输模式,标准100kbits/s,快速模式400kbit.s

    I2C协议有什么?

    I2C 里面定义了通信的 6 个方面

    1、起始和停止信号

    2、数据有效性、

    3、响应

    4、仲裁

    5、时钟同步

    6、地址广播


    (1)数据有效性

    I2C传输数据,SCL时钟要为高电平期间,SDA传输数据的线必须稳定;

    时钟为低电平的期间,数据线上的高电平或者低电平数据允许发生变化;

    传输数据以字节为单位,每次传输的字节数不受限制;


    (2)起始和停止信号

    时钟SCL为高电平期间,SDA数据线由高电平向低电平变化表示起始信号;

    时钟SCL为高电平期间,SDA数据线由低电平向高电平变化表示停止信号;

    起始和停止信号都是由主机发出,发送起始信号后,总线就处于被占用的状态,主机发送停止信号后,总线就处于空闲状态;


    (3)应答和响应

    发送端传输完一个字节的数据后,后面必须要跟一个校验位,这个校验位是 从机 通过控制SDA(数据线)来实现的,主机可以继续发送数据,这个校验位就是数据或地址传输过程中的响应。

    响应分为(应答ACK)和(非应答NACK)

    作为从机 当 主机接收到I2C传输的一个字节数据或地址后,若让主机继续发送需要向对方发送应答ACk信号低电平脉冲,主机就会继续发送下一个数据;

    若从机希望结束数据传输,则会向主机发送 非应答NACK信号高电平脉冲,主机收到非应答信号,就会产生停止信号,结束信号传输;

    每个字节必须保证8位,先传送高位MSB ,在传输地位LSB,传送的字节要跟一位应答位 (一帧 9 位 )


    (4)总线的寻址方式

    分为两种,7位和10位的

    D7~D1 是 从机的地址,D0位是数据传送方向位;

    为0表示主机向从机写数据,为1 主机向 从机读数据;

    主机发送一个地址,总线上每个器件都将头7位于自己的地址比较,一样,就会被主机选址

    四位是固定的,3个可编程


    (5)数据传输模式

    主机发送起始信号,发送从机地址+使能位写数据,从机发送应答,主机发送数据,从机应答主机发送数据,非应答,主机 发送结束信号;

    软件模拟:

    1. #include "iic.h"
    2. // at 芯片读写操作的
    3. // 起始信号
    4. void iic_start(void)
    5. {
    6. IIC_SCL = 1;
    7. IIC_SDA = 1;
    8. delay_10us(1);
    9. IIC_SDA = 0;
    10. delay_10us(1);
    11. IIC_SCL = 0;
    12. // 处于占用
    13. }
    14. // 停止信号
    15. void iic_stop(void)
    16. {
    17. IIC_SCL = 1;
    18. IIC_SDA = 0;
    19. delay_10us(1);
    20. IIC_SDA = 1;
    21. delay_10us(1);
    22. }
    23. // 应答信号
    24. void iic_ack(void)
    25. {
    26. IIC_SCL = 0;
    27. IIC_SDA = 0;
    28. delay_10us(1);
    29. IIC_SCL = 1;
    30. delay_10us(1);
    31. IIC_SCL = 0;
    32. }
    33. // 非应答信号
    34. void iic_nack(void)
    35. {
    36. IIC_SCL = 0;
    37. IIC_SDA = 1;
    38. delay_10us(1);
    39. IIC_SCL = 1;
    40. delay_10us(1);
    41. IIC_SCL = 0;
    42. }
    43. u8 iic_wait_ack(void)
    44. {
    45. u8 time_temp =0;
    46. IIC_SDA = 1;
    47. delay_10us(1);
    48. while(IIC_SDA)
    49. {
    50. time_temp++;
    51. if(time_temp>100)
    52. {
    53. iic_stop();
    54. return 1; // 返回1 停止应答
    55. }
    56. }
    57. IIC_SDA = 0;
    58. return 0;
    59. }
    60. // IIC写字节的操作
    61. void iic_write_byte( u8 dat) // 入参 传入字节
    62. {
    63. //
    64. u8 i =0;
    65. IIC_SCL=0;
    66. for(i=0;i<8;i++) //从高位 在地位 写入
    67. {
    68. if( (dat&0x80) > 1) // 0x80 1000 0000 从最高位 判断最高位为1 如果大于0
    69. IIC_SDA = 1;
    70. else
    71. IIC_SDA = 0;
    72. dat <<= 1; // 左移一位
    73. IIC_SDA = 0;
    74. delay_10us(1);
    75. IIC_SCL=0;
    76. delay_10us(1);
    77. }
    78. }
    79. // IIC 读字节操作
    80. u8 iic_read_byte(u8 ack)
    81. {
    82. u8 i =0;
    83. u8 receive =0;
    84. for(i=0;i<8;i++)
    85. {
    86. IIC_SCL = 0;
    87. delay_10us(1);
    88. IIC_SCL=1;
    89. delay_10us(1);
    90. receive<<=1;
    91. if(IIC_SDA)receive++;
    92. }
    93. if(!ack)iic_nack();
    94. else iic_ack();
    95. return receive;
    96. }

  • 相关阅读:
    k8s--基础架构--容器运行时接口 (CRI)和垃圾回收
    STM32 HAL库USART的接收数据方法实现
    用“和美”丈量中国丨走进酒博物馆系列⑨
    “中国版”马斯克被本尊翻牌:“如果是真的,我想见见他”
    容器编排学习(一)k8s集群管理
    Windows环境如何ssh远程连接本地局域网内的Archcraft系统
    非连续台阶状物体的仿真-含Matlab源码
    【Kafaka实现高吞吐量、低延迟的底层原理】
    单元测试中如何Mock HttpContext
    2021 RoboCom 世界机器人开发者大赛-高职组(复赛)
  • 原文地址:https://blog.csdn.net/m0_68021259/article/details/133268325