当前位置:   article > 正文

AT24C16-STM32-HAL库函数读写_#define at24c16 0xa0

#define at24c16 0xa0

AT24C16的地址

可以看到,16的数据地址是11位,器件地址的P2/P1/P0也是数据地址的一部分.

STM32的硬件I2C只有7/10BIT两种模式,因此本程序用7BIT实现。

函数实现

头文件

  1. #ifndef _AT24C16_H_
  2. #define _AT24C16_H_
  3. #include "main.h"
  4. #define AT24C16_DEVICE_ADDRESS 0xA0 // AT24C16的IIC地址
  5. uint16_t AT24C16_ADDRESS_2(uint16_t page, uint16_t bit);
  6. HAL_StatusTypeDef AT24C16_Write(uint16_t address, uint8_t *data, uint16_t size);
  7. HAL_StatusTypeDef AT24C16_Read(uint16_t address, uint8_t *rx_buffer, uint16_t size);
  8. HAL_StatusTypeDef AT24C16_Write_String(uint16_t address, uint8_t *data);
  9. HAL_StatusTypeDef AT24C16_Read_String(uint16_t address, uint8_t *data, uint16_t size);
  10. #endif

at24c16.c

  1. #include "main.h"
  2. #include "i2c.h"
  3. #include "gpio.h"
  4. #include "at24c16.h"
  5. #include "stddef.h"
  6. /*
  7. * 地址转换,将十进制地址转换成二进制地址
  8. * @page:页数
  9. * @bit:字节位
  10. */
  11. uint16_t AT24C16_ADDRESS_2(uint16_t page, uint16_t bit)
  12. {
  13. return ((page << 4) | bit);
  14. }
  15. /*
  16. * 写函数
  17. * @address:二进制地址
  18. * @data:数据地址
  19. * @size:数量
  20. */
  21. HAL_StatusTypeDef AT24C16_Write(uint16_t address, uint8_t *data, uint16_t size)
  22. {
  23. HAL_StatusTypeDef state = HAL_OK;
  24. uint8_t add = ((address >> 7) & 0x000e);
  25. add = AT24C16_DEVICE_ADDRESS | add;
  26. state = HAL_I2C_Mem_Write(&hi2c1, add, (uint8_t)address, I2C_MEMADD_SIZE_8BIT, data, size, 100);
  27. return state;
  28. }
  29. /*
  30. * 读函数
  31. * @address:二进制地址
  32. * @data:数据地址
  33. * @size:数量
  34. */
  35. HAL_StatusTypeDef AT24C16_Read(uint16_t address, uint8_t *rx_buffer, uint16_t size)
  36. {
  37. HAL_StatusTypeDef state = HAL_OK;
  38. uint8_t add = ((address >> 7) & 0x000e);
  39. add = AT24C16_DEVICE_ADDRESS | add;
  40. state = HAL_I2C_Mem_Read(&hi2c1, add, (uint8_t)address, I2C_MEMADD_SIZE_8BIT, rx_buffer, size, 100);
  41. return state;
  42. }
  43. /*
  44. * 连续写函数,没有实现任意字节
  45. * @address:地址(简单实现连续页)
  46. * @data:数据地址
  47. */
  48. HAL_StatusTypeDef AT24C16_Write_String(uint16_t address, uint8_t *data)
  49. {
  50. HAL_StatusTypeDef state = HAL_OK;
  51. uint16_t i = sizeof(data) / 16;
  52. (sizeof(data) % 16 != 0) ? i++ : 0;
  53. uint16_t j = address >> 4;
  54. for (int k = 0; k < i; k++)
  55. {
  56. state = AT24C16_Write(AT24C16_ADDRESS_2(j + k, 0), (uint8_t *)&data[i * 16], 16);
  57. }
  58. return state;
  59. }
  60. /*
  61. * 连续读函数,没有实现任意字节
  62. * @address:地址(简单实现连续页)
  63. * @data:数据地址
  64. * @size:数量
  65. */
  66. HAL_StatusTypeDef AT24C16_Read_String(uint16_t address, uint8_t *data, uint16_t size)
  67. {
  68. HAL_StatusTypeDef state = HAL_OK;
  69. uint16_t i = size / 16;
  70. (size % 16 != 0) ? i++ : 0;
  71. uint16_t j = address >> 4;
  72. for (int k = 0; k < i; k++)
  73. {
  74. state = AT24C16_Read(AT24C16_ADDRESS_2(j + k, 0), (uint8_t *)&data[i * 16], 16);
  75. }
  76. return state;
  77. }

调用方法 

 

注意

连续读写函数只进行了601个字节的测试!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/438249
推荐阅读
相关标签
  

闽ICP备14008679号