微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请问哪位高手用过STM32模拟IIC和MPR121通信的程序

请问哪位高手用过STM32模拟IIC和MPR121通信的程序

时间:10-02 整理:3721RD 点击:
最好能提供源码,小第我初学STM32,很多地方不懂,还请大家多指教,谢谢!

模拟IIC的话,基本代码都一样的,不过我用别的单片机可能延时有所不同,所以如果出问题,那里可能会出错。把GPIO口改一下就ok了吧。
以下是陀螺仪的,没有其他例子了。

  1. //刚开始记着将SCL 和SDA引脚定义为输出,并且将SDA输入使能:
  2. //如:GPIOB->PIDR ^=1<<27;DDRH3=1;DDRH4=1;
  3. #include "common.h"
  4. #include "include.h"
  5. //#include "iic.h"
  6. #define uchar unsigned char
  7. int dis_datax,dis_datay,dis_dataz;  
  8. int IIC_Receive[6];   
  9. uchar IIC_ERROR;  /*应答标志位*/  

  10. #define SCL_out PTC10_OUT          //定义IIC时钟线输出高低IO2
  11. #define SDA_out PTC11_OUT          //定义IIC数据线输出高低IO3
  12. #define SCL_in PTC10_IN          //定义IIC时钟线输入
  13. #define SDA_in PTC11_IN          //定义IIC数据线输入
  14. #define SCL_dir DDRC10    //定义时钟线方向寄存器
  15. #define SDA_dir DDRC11    //定义数据线方向寄存器   
  16. #define READ 0xD2            //定义L3G4200DIIC地址

  17. void Delay1us(u8 x)
  18. {
  19. u16  i;
  20. for(i=0;i<64*x;i++);

  21. }

  22. /***************************************************
  23.                      IIC通信
  24. 注意   !总线频率为80MHZ,如需应用与不同频率,请
  25. 更改延时函数,增减至合适的NOP数量。器件地址为SDO接高的地址
  26. SDO默认为高。
  27. ****************************************************/

  28. void IIC_START()   
  29. {   
  30.     SDA_out=1;     /*发送起始条件的数据信号*/   
  31.     Delay1us(1);   
  32.     SCL_out=1;   
  33.     Delay1us(5);      /*起始条件建立时间大于4.7us,延时*/   
  34.     SDA_out=0;     /*发送起始信号*/   
  35.     Delay1us(5);      /* 起始条件锁定时间大于4μs*/   
  36.     SCL_out=0;     /*钳住IIC总线,准备发送或接收数据 */   
  37.     Delay1us(2);   
  38. }   
  39. void  IIC_STOP()   
  40. {   
  41.      SDA_out=0;    /*发送结束条件的数据信号*/   
  42.      Delay1us(1);     /*发送结束条件的时钟信号*/   
  43.      SCL_out=1;    /*结束条件建立时间大于4us*/   
  44.      Delay1us(5);   
  45.       
  46.      SDA_out=1;    /*发送IIC总线结束信号*/   
  47.      Delay1us(4);   
  48. }   
  49. void IIC_Send_ack()   
  50. {   
  51.      SDA_out=1;   
  52.      Delay1us(1);   
  53.      SCL_out=1;   
  54.      Delay1us(5);   
  55.      SCL_out=0;   
  56.      Delay1us(2);   
  57. }   
  58. void IIC_Check_ack()   
  59. {   
  60.      Delay1us(3);   
  61.      SCL_out=0;   
  62.      Delay1us(3);   
  63.      SDA_dir=0;   
  64.      SDA_in=1;   
  65.      Delay1us(3);   
  66.      SCL_out=1;   
  67.      Delay1us(5);   
  68.      if(SDA_in==1)   
  69.          IIC_ERROR=1;   
  70.      else   
  71.          IIC_ERROR=0;   
  72.      SCL_out=0;   
  73.      Delay1us(3);   
  74.      SDA_dir=1;   
  75. }   
  76. //**************通过IIC总线发送1字节数据***************//  
  77. void IIC_Send1byte(uchar data)   
  78. {   
  79.      unsigned int i=8;   
  80.      uchar m=data;   
  81.      uchar temp;   
  82.      for(i=8;i>0;i--)   
  83.      {   
  84.          temp=m&0x80;   
  85.          if(temp==0x80)   
  86.              SDA_out=1;   
  87.          else   
  88.              SDA_out=0;   
  89.          Delay1us(5);   
  90.          SCL_out=1;   
  91.          Delay1us(5);   
  92.          SCL_out=0;   
  93.          m=m<<1;      
  94.      }   
  95. }   
  96. //***************通过IIC总线接受1字节数据******************//
  97. uchar IIC_Receive1byte()   
  98. {   
  99.      int i=8;   
  100.      uchar j=0;   
  101.      SDA_dir=0;   
  102.      SDA_in=1;   
  103.      for(i=8;i>0;i--)   
  104.      {   
  105.          SDA_in=1;   
  106.          Delay1us(3);   
  107.          SCL_out=1;   
  108.          Delay1us(5);   
  109.          if(SDA_in==1)   
  110.              j=j|0x01;   
  111.          else   
  112.            j=j;   
  113.              SCL_out=0;   
  114.             
  115.          if(i!=1)   
  116.          {   
  117.              j=j<<1;   
  118.          }   
  119.      }   
  120.      SDA_dir=1;   
  121.      return j;   
  122. }      
  123. // *****通过IIC总线向某一寄存器写入一个字节数据********  
  124. void IIC_write(uchar add,uchar mem,uchar data)               // 写数据(器件地址,寄存器地址,数据)
  125. {   
  126.      IIC_START();   
  127.      IIC_Send1byte(add);   
  128.      IIC_Check_ack();   
  129.      IIC_Send1byte(mem);   
  130.      IIC_Check_ack();     
  131.      IIC_Send1byte(data);
  132.      IIC_Check_ack();   
  133.      IIC_STOP();      
  134. }   

  135. //***************L3G4200D读取*******************//

  136. void L3G4200D_Init()
  137. {

  138.     IIC_write(READ,0X20, 0x8F);   
  139.     IIC_write(READ,0X21, 0x00);   
  140.     IIC_write(READ,0X22, 0x08);  
  141.     IIC_write(READ,0X23, 0x36 );  
  142.     IIC_write(READ,0X24, 0x00);   
  143. }

  144. int IIC_Read(uchar add,uchar mem)      // 读数据(器件地址,寄存器地址)
  145. {        
  146.      int data;
  147.      IIC_START();   
  148.      IIC_Send1byte(add);   
  149.      IIC_Check_ack();   
  150.      IIC_Send1byte(mem);     
  151.      IIC_Check_ack();   
  152.      IIC_START();   
  153.      IIC_Send1byte(add+1);   
  154.      IIC_Check_ack();  
  155.      data=IIC_Receive1byte();      
  156.      IIC_Send_ack();
  157.      IIC_STOP();
  158.      return data;  
  159. }  


  160. void GET_AngleSpeed()
  161. {
  162.                                                                                                   
  163.      IIC_Receive[0]=IIC_Read(READ,0X28);                         //    x
  164.      IIC_Receive[1]=IIC_Read(READ,0X29);                          //
  165.      dis_datax=(IIC_Receive[1]<<8)+IIC_Receive[0];
  166.       
  167.      IIC_Receive[2]=IIC_Read(READ,0X2A);                         //   Y
  168.      IIC_Receive[3]=IIC_Read(READ,0X2B);                         //数据合成
  169.      dis_datay=(IIC_Receive[3]<<8)+IIC_Receive[2];     //因为经过了自检,初始后波形更好,但是不在0位
  170.                                                                                              
  171.        IIC_Receive[4]=IIC_Read(READ,0X2C);                         //    Z
  172.        IIC_Receive[5]=IIC_Read(READ,0X2D);                          //
  173.        dis_dataz=(IIC_Receive[5]<<8)+IIC_Receive[4];     //
  174. }

复制代码

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top