国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: STM32的IIC通訊協議示例工程AT24CXX源碼 [打印本頁]

作者: 路漫漫    時間: 2020-5-21 01:10
標題: STM32的IIC通訊協議示例工程AT24CXX源碼
說明:本例程實驗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. }
復制代碼





歡迎光臨 ELEOK (http://m.afoofa.cn/) Powered by Discuz! X5.0