IIC模块代码(HAL库,直接取用)

鼠扑  论坛元老 | 2024-8-10 21:05:35 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 2027|帖子 2027|积分 6081

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
HAL库编写的IIC模块代码,包括start/stop,发送/吸收字节,发送/吸收应答
  使用时必要根据从机电气属性修改传输速率与延时
  不要忘了根据需求修改IO口
  Delay函数可用GPT天生
  代码如下:
  1. #include "stm32f4xx_hal.h"
  2. #include "Delay.h"
  3. //SDA:PB12  SCL:PB13
  4. /**
  5.   * 函    数:I2C写SDA与SCL引脚电平
  6.   * 参    数:写入的电平(0或1)
  7.   * 返 回 值:无
  8.   * 注意事项:为防止从机跟不上主机的翻转速度,写入后延时4微秒
  9.   *         此项根据从机IIC传输电气属性得知
  10.   */
  11. void IIC_W_SDA(uint8_t bitvalue)
  12. {
  13.     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, (GPIO_PinState)bitvalue);
  14.     delay_us(4);
  15. }
  16. void IIC_W_SCL(uint8_t bitvalue)
  17. {
  18.     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, (GPIO_PinState)bitvalue);
  19.     delay_us(4);
  20. }
  21. /**
  22.   * 函    数:I2C读SDA引脚电平
  23.   * 参    数:无
  24.   * 返 回 值:读出的电平(0或1)
  25.   * 注意事项:为防止从机跟不上主机的翻转速度,读出后延时4微秒
  26.   */
  27. uint8_t IIC_R_SDA(void)
  28. {
  29.     uint8_t bitvalue;
  30.     bitvalue = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12);
  31.     delay_us(4);
  32.     return bitvalue;
  33. }
  34. /**
  35.   * 函    数:I2C初始化
  36.   * 参    数:无
  37.   * 返 回 值:无
  38.   * 注意事项:无
  39.   */
  40. void IIC_Init(void)
  41. {
  42.     //时钟使能
  43.     __HAL_RCC_GPIOB_CLK_ENABLE();
  44.    
  45.     //IO口模式
  46.     GPIO_InitTypeDef GPIO_Init;
  47.     GPIO_Init.Mode = GPIO_MODE_OUTPUT_OD;
  48.     GPIO_Init.Pin = GPIO_PIN_12 | GPIO_PIN_13;
  49.     GPIO_Init.Speed = GPIO_SPEED_FREQ_MEDIUM;
  50.     HAL_GPIO_Init(GPIOB, &GPIO_Init);
  51.    
  52.     //默认初始化后引脚电平为高电平
  53.     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12 | GPIO_PIN_13, GPIO_PIN_SET);
  54. }
  55. /**
  56.   * 函    数:I2C传输开始
  57.   * 参    数:无
  58.   * 返 回 值:无
  59.   * 注意事项:按照IIC起始逻辑编写
  60.   */
  61. void IIC_Start(void)
  62. {
  63.     //手动拉高电平
  64.     IIC_W_SCL(1);
  65.     IIC_W_SDA(1);
  66.    
  67.     //进入IIC传输
  68.     IIC_W_SDA(0);
  69.     IIC_W_SCL(0);
  70. }
  71. /**
  72.   * 函    数:I2C传输终止
  73.   * 参    数:无
  74.   * 返 回 值:无
  75.   * 注意事项:按照IIC终止逻辑编写
  76.   */
  77. void IIC_Stop(void)
  78. {
  79.     //手动拉低电平
  80.     IIC_W_SDA(0);
  81.    
  82.    //终止信号
  83.    IIC_W_SCL(1);
  84.    IIC_W_SDA(1);
  85. }
  86. /**
  87.   * 函    数:I2C发送一个字节
  88.   * 参    数:要发送的数据
  89.   * 返 回 值:无
  90.   * 注意事项:高位先行,先把数据放在SDA上,再拉高SCL读取
  91.   */
  92. void IIC_SendByte(uint8_t Byte)
  93. {
  94.     uint8_t i;
  95.     for(i = 0;i < 8;i++)
  96.     {
  97.         IIC_W_SDA(Byte & (0X80 >> i));//提取出第i位的数据
  98.         IIC_W_SCL(1);
  99.         IIC_W_SCL(0);
  100.     }
  101. }
  102. /**
  103.   * 函    数:I2C接收一个字节
  104.   * 参    数:无
  105.   * 返 回 值:无
  106.   * 注意事项:高位先行,先把数据放在SDA上,再拉高SCL读取
  107.   */
  108. uint8_t IIC_ReceiveByte(void)
  109. {
  110.     uint8_t i, Byte = 0X00;
  111.     IIC_W_SDA(1);
  112.     for(i = 0;i < 8;i++)
  113.     {
  114.         IIC_W_SCL(1);
  115.         if(IIC_R_SDA() == 1)
  116.             Byte |= (0X80 >> i);
  117.         IIC_W_SCL(0);
  118.     }
  119.   
  120.     return Byte;
  121. }
  122. /**
  123.   * 函    数:I2C发送应答
  124.   * 参    数:无
  125.   * 返 回 值:无
  126.   * 注意事项:无
  127.   */
  128. void IIC_SendACK(uint8_t AckBit)
  129. {
  130.         IIC_W_SDA(AckBit);//提取出第i位的数据
  131.         IIC_W_SCL(1);
  132.         IIC_W_SCL(0);
  133. }
  134. /**
  135.   * 函    数:I2C接收应答
  136.   * 参    数:无
  137.   * 返 回 值:无
  138.   * 注意事项:无
  139.   */
  140. uint8_t IIC_ReceiveAck(void)
  141. {
  142.     uint8_t AckBit;
  143.    
  144.     IIC_W_SDA(1);
  145.     IIC_W_SCL(1);
  146.     AckBit = IIC_R_SDA();
  147.     IIC_W_SCL(0);
  148.     return AckBit;
  149. }
复制代码
立个flag:本月之前把Veriog的语法写出来!!!
如有错误,欢迎指正

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表