找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM32的IIC通讯协议示例工程AT24CXX源码

[复制链接]
路漫漫 发表于 2020-5-21 01:10:52 | 显示全部楼层 |阅读模式
说明:本例程实验STM32F103ZET6与AT24C02通讯,初次编写,欢迎大佬批正。

STM32_IIC_AT24xx工程源码.7z (175.33 KB, 售价: 1 E币)
接口如下:
        SDA  PA5
        SCL   PA4
        LED   PE5
现象:复写成功,PE5输出低电平///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IIC.C
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1. #include "iic.h"
  2. #include "sys.h"
  3. #include "delay.h"
  4. #define IICDELAY delay_us(10);
  5. #define SDA_IN  sda_i();
  6. #define SDA_OUT sda_o();
  7. #define SDA_H    GPIOA->ODR|= (1<<5);
  8. #define SDA_L    GPIOA->ODR&= ~(1<<5);
  9. #define SCL_H    GPIOA->ODR|= (1<<4);
  10. #define SCL_L    GPIOA->ODR&= ~(1<<4);
  11. #define SDA       ((GPIOA->IDR)>>5)&0X01
  12. //PB3 SCL    PB4 SDA
  13. /*IIC初始化*/
  14. void iic_init(void)
  15. {
  16.   RCC->APB2ENR |= 1<<2;//使能PA时钟
  17. GPIOA->CRL &= ~(0xff << 4*3) ;  //清除CRL第20到23位值
  18. GPIOA->CRL |= 0x33 << 4*3;      //设置B3B4输出  50MHZ模式
  19. GPIOA->ODR |= (1<<5)|(1<<4);    //设置为高电平
  20. }
  21. /*端口输入模式*/
  22. void sda_i(void)
  23. {
  24.   GPIOA->CRL &= ~(0xf0 << 4*4) ;  //清除CRL第20到23位值
  25. GPIOA->CRL |= 0x80 << 4*4;      //设置B3B4输入  默认上拉 50MHz模式
  26. GPIOA->ODR |= (1<<5);    //设置为上拉模式
  27. }
  28. /*端口输出模式*/
  29. void sda_o(void)
  30. {
  31.   GPIOA->CRL &= ~(0xf0 << 4*4) ;  //清除CRL第20到23位值
  32. GPIOA->CRL |= 0x30 << 4*4;      //设置B3B4输出 50MHz模式
  33. }
  34. /*IIC起始信号*/
  35. void iic_start(void)
  36. {
  37.   SDA_OUT
  38. SCL_H
  39.   IICDELAY
  40. SDA_H
  41. IICDELAY
  42. SDA_L
  43. IICDELAY
  44. }
  45. /*IIC终止信号*/
  46. void iic_stop(void)
  47. {
  48.   SDA_OUT
  49. SDA_L
  50.   IICDELAY
  51. SCL_H
  52. IICDELAY
  53. SDA_H
  54. IICDELAY
  55. }
  56. /*主机发送应答*/
  57. void master_ack(char i)//0为不应答
  58. {
  59.   SDA_OUT
  60.   SCL_L
  61. IICDELAY

  62. if(i)
  63. SDA_L
  64. else
  65. SDA_H

  66. IICDELAY
  67.   SCL_H
  68. IICDELAY
  69. SDA_IN
  70.   SCL_L
  71. }
  72. /*检测从机应答*/
  73. char test_ack(void)
  74. {
  75.   SDA_IN
  76. SCL_H
  77. IICDELAY
  78. if(SDA)     //如果高电平   非应答
  79. {
  80. SCL_L
  81. IICDELAY
  82. iic_stop();
  83. return(0);
  84. }
  85. else        //低电平    应答
  86. {
  87. SCL_L
  88. IICDELAY
  89. return(1);
  90. }
  91. }
  92. /*发送一个字节*/
  93. void iic_send_byte(unsigned char byte)
  94. {
  95.   unsigned char i;
  96. SDA_OUT
  97. for(i = 0;i < 8;i++)
  98.   {
  99.   SCL_L
  100.   IICDELAY
  101.    if(byte&0x80)
  102.    SDA_H
  103.    else
  104.   SDA_L
  105.   IICDELAY
  106.   SCL_H
  107.   IICDELAY
  108.   byte<<=1;
  109. }
  110. SCL_L
  111. IICDELAY
  112. SDA_IN
  113. IICDELAY
  114. }
  115. /*读一个字节*/
  116. unsigned char iic_read_byte(void)
  117. {
  118.   unsigned char dat,i;
  119. SCL_L
  120. IICDELAY
  121. SDA_IN
  122. IICDELAY
  123. for(i = 0;i < 8;i ++)
  124. {
  125.    SCL_H
  126.    IICDELAY
  127.   if(SDA)
  128.   {
  129.     dat|=0x01;
  130.   }
  131.     else
  132.   {
  133.    dat&=0xfe;
  134.   }
  135.     IICDELAY
  136.     SCL_L
  137.     IICDELAY
  138.   if(i < 7)
  139.   {
  140.    dat = dat << 1;
  141.   }      
  142. }
  143. return(dat);
  144. }
  145. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  146. AT24C02.C
  147. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  148. #include "24cxx.h"
  149. #define AT24C02_ADDR 0xa0
  150. /*AT24C02初始化*/
  151. void AT24CXX_init(void)
  152. {
  153. iic_init();
  154. }
  155. /*发送数据*/
  156. unsigned char AT24CXX_TransmitData(unsigned char ADDR,unsigned char DAT)
  157. {
  158.     iic_start();
  159.    iic_send_byte(AT24C02_ADDR+0);
  160.    if(!test_ack())
  161.   {
  162.      return(0);
  163.   }
  164.   iic_send_byte(ADDR);
  165.    if(!test_ack())
  166.   {
  167.      return(0);
  168.   }
  169.   iic_send_byte(DAT);
  170.    if(!test_ack())
  171.   {
  172.      return(0);
  173.   }  
  174.   iic_stop();
  175.      return(1);
  176. }
  177. unsigned char AT24CXX_ReceiveData(unsigned char ADDR)
  178. {
  179. unsigned char DAT;
  180. iic_start();
  181. iic_send_byte(AT24C02_ADDR+0);
  182. if (!test_ack())
  183. {
  184.   return(0);
  185. }
  186. iic_send_byte(ADDR);
  187. master_ack(0);
  188. iic_start();
  189. iic_send_byte(AT24C02_ADDR+1);
  190. if (!test_ack())
  191. {
  192.   return(0);
  193. }
  194. DAT = iic_read_byte();
  195. master_ack(0);
  196. iic_stop();
  197. return(DAT);
  198. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-12-23 10:31

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表