久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 改進型STM32模擬IIC 源程序 [打印本頁]

作者: isdasjkdajk    時間: 2019-11-2 20:49
標題: 改進型STM32模擬IIC 源程序
最近在研究MPU6050,但是MPU6050的底層驅動又不想自己寫,那怎么辦呢我就想到了去移植正點原子的代碼,但是打開代碼一看需要修改寄存器值 那意味著要去翻數據是手冊,我這個人本身比較懶不想去翻,也為了以后不翻,于是乎我想到了自己動手寫模擬IIC的代碼。寫的過程中我就發(fā)現一個問題為什么每次都要管腳切換方向非常麻煩(本人非常煩這一點),于是乎我就在想有沒有辦法不切換方向去讀數據。最后我終于在野火的樹上找到了這樣一句話“STM32的管腳在輸出模式下也可以讀到數據”,起初我對這句話半信半疑于是我自己做了一波實驗,把管腳配置成輸出模式(推挽和開漏都配置了)結果真的能讀到數據不過要使用函數GPIO_ReadInputDataBit去讀IDR寄存器的值。用位帶操作就是不行。然后抱著這個結果我就開始了寫IIC。在這里對IIC協議不再介紹,畢竟網上大佬挺多的隨便改都能找到協議的說明。我的代碼最大的好處就是容易移植容易修改廢話不多說了開始附上代碼。

單片機源程序如下:
  1. #include "bsp_i2c_ee.h"

  2. /*適用于STM32F103系列*/
  3. void IIC_Init(void)   //初始化IIC總線所用到的端口
  4. {
  5.                 GPIO_InitTypeDef IICBUS;
  6.           IICBUS.GPIO_Mode = GPIO_Mode_Out_OD;
  7.                 IICBUS.GPIO_Speed = GPIO_Speed_50MHz;
  8.                 IICBUS.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;   //修改
  9.                 GPIO_Init(GPIOA,&IICBUS);                  //修改
  10.                 GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); // 修改 //拉高總線(釋放總線)不進行操作
  11.                         
  12. }

  13. static void  IIC_Delay(void) //IIC延時函數對總線速度進行控制
  14. {
  15.    u8 i = 0;
  16.          /* 
  17.                  下面的時間是通過邏輯分析儀測試得到的。
  18.     工作條件:CPU主頻72MHz ,MDK編譯環(huán)境,1級優(yōu)化
  19.                 循環(huán)次數為10時,SCL頻率 = 205KHz
  20.                 循環(huán)次數為7時,SCL頻率 = 347KHz, SCL高電平時間1.5us,SCL低電平時間2.87us
  21.                  循環(huán)次數為5時,SCL頻率 = 421KHz, SCL高電平時間1.25us,SCL低電平時間2.375us
  22.         */
  23.         for (i = 0; i < 7; i++);        
  24. }


  25. //  IIC起始信號
  26. void IIC_Start(void)   
  27. {
  28.                 SDA_SETB;
  29.                 SCL_SETB;
  30.                 IIC_Delay();
  31.                 SDA_CLR;
  32.                 IIC_Delay();
  33.                 SCL_CLR;
  34. }

  35. // IIC停止信號
  36. void IIC_Stop(void)
  37. {
  38.                 SCL_CLR;
  39.                 SDA_CLR;
  40.                 SCL_SETB;
  41.           IIC_Delay();
  42.                 SDA_SETB;
  43.                 IIC_Delay();
  44. }

  45. //IIC主機產生應答信號
  46. void IIC_Ack(void)
  47. {
  48.                 SCL_CLR;
  49.                 SDA_CLR;
  50.                 IIC_Delay();
  51.                 SCL_SETB;
  52.                 IIC_Delay();
  53.                 SCL_CLR;
  54. }

  55. //IIC主機不應答
  56. void IIC_Nack(void)
  57. {
  58.                 SCL_CLR;
  59.                 SDA_SETB;
  60.                 IIC_Delay();
  61.                 SCL_SETB;
  62.                 IIC_Delay();
  63.                 SCL_CLR;
  64.                
  65. }



  66. //IIC主機等待從機應答

  67. u8 IIC_WaitAck(void)
  68. {
  69.           u8 timeout = 0;
  70.                 SDA_SETB;
  71.                 IIC_Delay();
  72.                 SCL_SETB;
  73.                 IIC_Delay();
  74.           while(SDA_Read)//讀取
  75.                 {        
  76.                                 if(++timeout>250)
  77.                                 {
  78.                                                 IIC_Stop();
  79.                                                 return 1; //超時沒有應答
  80.                                 }
  81.                 }
  82.                 SCL_CLR;
  83.                 return 0; //應答了        
  84. }


  85. //IIC總線發(fā)送一組數據
  86. void IIC_SendByte(u8 TXData)
  87. {
  88.                 u8 i = 0;
  89.                 SCL_CLR;
  90.                 for(i = 0;i<8;i++)
  91.                 {
  92.                                 if(TXData&0x80)
  93.                                 {
  94.                                                 SDA_SETB;
  95.                                 }
  96.                                 else
  97.                                 {
  98.                                                 SDA_CLR;
  99.                                 }
  100.                                 IIC_Delay();
  101.                                 SCL_SETB;
  102.                                 IIC_Delay();
  103.                                 SCL_CLR;
  104.                                 TXData<<=1;
  105.                 }
  106. }

  107. //讀取一byte數據
  108. //ack = 1;應答
  109. //ack = 0;不應答
  110. u8 IIC_ReadByte(u8 ack)
  111. {
  112.                  u8 Receive = 0;
  113.                  u8 i = 0;
  114.                  for(i=0;i<8;i++)
  115.                  {
  116.                          SCL_CLR;
  117.                          IIC_Delay();
  118.                          SCL_SETB;
  119.                          Receive<<=1; //先左移動一位空位置出來
  120.                          if(SDA_Read)
  121.                          {
  122.                                         Receive ++;
  123.                          }
  124.                          IIC_Delay();
  125.                  }
  126.                  if(ack)
  127.                  {
  128.                                 IIC_Ack(); //產生應答信號
  129.                  }
  130.                  else
  131.                  {
  132.                                 IIC_Nack();//不產生應答信號
  133.                  }
  134.                  return Receive;
  135. }


  136. //返回0檢測到了設備
  137. //返回1沒有檢測到設備
  138. //參數是你所要檢測的設備的地址
  139. u8 IIC_CheckDevice(u8 __Address)//檢測外部是否掛載了從機
  140. {
  141.         u8 ucAck = 0;
  142.         IIC_Init();
  143.         IIC_Start();
  144.         IIC_SendByte(__Address|IIC_Wr);
  145.         ucAck = IIC_WaitAck();
  146.         IIC_Stop();
  147.         return ucAck;
  148. }

復制代碼
全部資料51hei下載地址:
i2c.zip (1.82 KB, 下載次數: 31)





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美国产一区二区 | 日韩最新网址 | 老牛嫩草一区二区三区av | 久久精品成人 | 久久精品中文字幕 | 国产精品久久久一区二区三区 | 久久久精品一区 | 欧美日韩精品一区二区 | 日韩一区二区三区视频 | 欧美a免费 | 羞羞的视频免费在线观看 | 久久国产精品99久久久久久丝袜 | 亚洲444eee在线观看 | 一区二区三区四区不卡视频 | 日韩国产中文字幕 | 国产精品久久一区二区三区 | 国产精品一区二区视频 | 激情毛片| 国产成人精品免费视频 | 网址黄| 午夜成人在线视频 | 精品欧美一区二区精品久久久 | 久久精品日产第一区二区三区 | 亚洲不卡一 | a级在线免费视频 | 瑟瑟免费视频 | 国产精品欧美一区二区 | 久久久精品久 | 国产美女视频 | 黄网站色大毛片 | 中文字幕国产精品视频 | 免费一看一级毛片 | 日韩电影一区 | 在线观看国产视频 | 婷婷综合色 | 国产一级片一区二区三区 | 黄色国产视频 | 国产精品1区 | 九色在线 | 999re5这里只有精品 | 亚洲一区二区三区免费在线 |