求一个MSPF5529LP的IIC例程

2019-07-15 15:37发布

想读一个传感器的数据,但需要用到IIC,有没有哪位大佬,可以分享一下IIC的例程,跪求。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
tttt石木
2019-07-15 19:29
  1. //头文件
  2. #ifndef _IIC_H
  3. #define _IIC_H

  4. #include "io430f5529.h"
  5. #include "IOPIN.h"
  6. #include <stdint.h>

  7. #define   SCL_HIGH    P4OUT|=BIT2  
  8. #define   SCL_LOW     P4OUT&=~BIT2
  9. #define   SDA_HIGH    P4OUT|=BIT1
  10. #define   SDA_LOW     P4OUT&=~BIT1

  11. #define   SDA_OUT()   P4DIR|=BIT1
  12. #define   SDA_IN()    P4DIR&=~BIT1
  13. #define   SCL_OUT()   P4DIR|=BIT2
  14. #define   SCL_IN()    P4DIR&=~BIT2

  15. //#define   READ_SDA    P_ReadInputDataBit()

  16. void IIC_delayus(unsigned int i);
  17. void IIC_init(void);
  18. void IIC_Start(void);
  19. void IIC_Stop(void);
  20. void IIC_Send_Byte(uint8_t txd);
  21. uint8_t IIC_Wait_Ack(void);
  22. void IIC_Ack(void);
  23. void IIC_NAck(void);
  24. uint8_t IIC_Read_Byte(unsigned char ack);


  25. #endif

  26. //IIC.c文件
  27. #include "io430f5529.h"
  28. #include "IIC.h"


  29. void IIC_delayus(unsigned int i)
  30. {
  31.   unsigned int j,k;
  32.   for(k=0;k<i;k++)
  33.     for(j=0;j<4;j++);
  34. }                       

  35. void IIC_init()
  36. {
  37.   P4DIR|=(BIT1+BIT2); //配置IIC IO口为输出方向
  38.   P4SEL|=(BIT1+BIT2);
  39. }



  40. void IIC_Start()
  41. {
  42.    SDA_OUT();
  43.    SCL_OUT();
  44.    SCL_HIGH;
  45.    SDA_HIGH;
  46.   IIC_delayus(2);
  47.    SDA_LOW;
  48.   IIC_delayus(2);
  49.    SCL_LOW;

  50. }



  51. void IIC_Stop()
  52. {
  53.      SDA_OUT();
  54.      SCL_OUT();
  55.      SCL_LOW;
  56.      SDA_LOW;
  57.     IIC_delayus(2);
  58.      SCL_HIGH;
  59.      SDA_HIGH;
  60.     IIC_delayus(2);
  61. }


  62. void IIC_Send_Byte(uint8_t txd)
  63. {
  64.    uint8_t t;   
  65.    SDA_OUT();             
  66.    SCL_LOW;
  67.     for(t=0;t<8;t++)
  68.     {
  69.         if(txd&0x80)
  70.         {
  71.             SDA_HIGH;
  72.         }
  73.         else
  74.         {
  75.             SDA_LOW;
  76.         }
  77.         txd<<=1;
  78.                 IIC_delayus(2);
  79.                 SCL_HIGH;
  80.                 IIC_delayus(2);
  81.                 SCL_LOW;
  82.                 IIC_delayus(2);
  83.     }
  84. }


  85. uint8_t IIC_Wait_Ack(void)
  86. {
  87.         SDA_IN();      //SDA设置为输入  
  88.         SDA_HIGH;
  89.         IIC_delayus(1);          
  90.         SCL_HIGH;
  91.         IIC_delayus(1);         
  92.         P4IN&BIT1;
  93.         IIC_delayus(5);
  94.         SCL_LOW;//时钟输出0           
  95.         return 0;
  96. }
  97. //产生ACK应答
  98. void IIC_Ack(void)
  99. {
  100.         SCL_LOW;
  101.         SDA_OUT();
  102.         SDA_LOW;
  103.         IC_delayus(2);
  104.         SCL_HIGH;
  105.         IIC_delayus(2);
  106.         SCL_LOW;
  107. }
  108. //不产生ACK应答                    
  109. void IIC_NAck(void)
  110. {
  111.         SCL_LOW;
  112.         SDA_OUT();
  113.         SDA_HIGH;
  114.         /IC_delayus(2);
  115.         SCL_HIGH;
  116.         IIC_delayus(2);
  117.         SCL_LOW;
  118. }                                                                              


  119. uint8_t IIC_Read_Byte(unsigned char ack)
  120. {
  121.         unsigned char i,receive=0;
  122.         SDA_IN();//SDA设置为输入
  123.     for(i=0;i<8;i++ )
  124.         {
  125.         SCL_LOW;
  126.         IIC_delayus(2);
  127.         SCL_HIGH;
  128.         receive<<=1;
  129.         if(P4IN&BIT1)receive++;   
  130.         IIC_delayus(1);
  131.         }                                         
  132.     if (!ack)
  133.     {
  134.         IIC_NAck();//发送nACK
  135.     }
  136.     else
  137.     {
  138.         IIC_Ack(); //发送ACK  
  139.     }
  140.     return receive;
  141. }


复制代码

你看看能不能用。

一周热门 更多>