STM32的IIC存储和读取整形数据

发布时间 2023-07-21 08:50:18作者: SymPny

STM32的IIC存储和读取整形数据,

下面的程序代码是使用stm32F03ZET6的I2C1(PB6,PB7)和AT24C02的EEPROM来测试的。希望对于需要的朋友有帮助。

主要代码如下:

  1. #include "delay.h"
  2. #include "stm32f10x.h"
  3. #include "usart.h"
  4. #include "24cxx.h"
  5. void readNInt(u16 addr,int *buf,int len);
  6. void writeOneInt(u16 addr,int data);
  7. int readOneInt(u16 addr);
  8. void writeNInt(u16 addr,int arr[],int len);
  9. int arr[] = {1222,1223,1224,1225,1226};
  10. int buf[5] = {0};
  11. char j = 0;
  12. int main(void)
  13. {
  14. delay_init(); //延时函数初始化
  15. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组
  16. uart_init(115200); //串口初始化为115200
  17. AT24CXX_Init(); //IIC初始化
  18. while(AT24CXX_Check())//检测不到24c02
  19. {
  20. printf("AT24C02 filed\r\n");
  21. }
  22. printf("AT24c02 is ok\r\n");
  23. /*测试向EEPROM中写入和读取一个整形数的程序*/
  24. writeOneInt(2,1024);
  25. delay_ms(1000);
  26. printf("read result is %d\r\n",readOneInt(2));
  27. /*测试写入和读取N个整形数的测试程序*/
  28. writeNInt(100,arr,5);
  29. delay_ms(1000);
  30. readNInt(100,buf,5);
  31. for(j=0;j<5;j++)
  32. {
  33. printf("%d\t",buf[j]);
  34. }
  35. printf("\r\n");
  36. while(1)
  37. {
  38. }
  39. }
  40. //功能:向EEPROM指定的地址写一个整形数
  41. //参数:addr:写入地址
  42. // data:写入的数据
  43. void writeOneInt(u16 addr,int data)
  44. {
  45. char tmp = 0,i = 0;
  46. for(;i<4;i++)
  47. {
  48. tmp = (char)(data & 0xFF);
  49. AT24CXX_WriteOneByte(addr,tmp);
  50. data = data >> 8;
  51. addr++;
  52. }
  53. }
  54. //功能:在EEPROM中的指定地址读取一个整形数
  55. //参数:addr:地址
  56. int readOneInt(u16 addr)
  57. {
  58. int tmp = 0;
  59. char i = 0;
  60. for(;i<4;i++)
  61. {
  62. tmp = tmp | (AT24CXX_ReadOneByte(addr) << (i*8)) ;
  63. addr++;
  64. }
  65. return tmp;
  66. }
  67. //功能:向EEPROM指定的地址写N个整形数
  68. //参数:addr:写入地址
  69. // arr:要写入数据所在的缓冲区
  70. // len:写入的个数
  71. void writeNInt(u16 addr,int *arr,int len)
  72. {
  73. char i = 0;
  74. for(;i<len;i++)
  75. {
  76. writeOneInt(addr,*(arr +i));
  77. addr += 4;
  78. }
  79. }
  80. //功能:向EEPROM指定的地址读N个整形数
  81. //参数:addr:读取地址
  82. // arr:读取数据要保存的缓冲区
  83. // len:读取的个数
  84. void readNInt(u16 addr,int *buf,int len)
  85. {
  86. char i = 0;
  87. for(;i<len;i++)
  88. {
  89. buf[i] = readOneInt(addr);
  90. addr += 4;
  91. }
  92. }