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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2576|回復: 0
打印 上一主題 下一主題
收起左側

改進型STM32模擬IIC 源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:269804 發表于 2019-11-2 20:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近在研究MPU6050,但是MPU6050的底層驅動又不想自己寫,那怎么辦呢我就想到了去移植正點原子的代碼,但是打開代碼一看需要修改寄存器值 那意味著要去翻數據是手冊,我這個人本身比較懶不想去翻,也為了以后不翻,于是乎我想到了自己動手寫模擬IIC的代碼。寫的過程中我就發現一個問題為什么每次都要管腳切換方向非常麻煩(本人非常煩這一點),于是乎我就在想有沒有辦法不切換方向去讀數據。最后我終于在野火的樹上找到了這樣一句話“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編譯環境,1級優化
  19.                 循環次數為10時,SCL頻率 = 205KHz
  20.                 循環次數為7時,SCL頻率 = 347KHz, SCL高電平時間1.5us,SCL低電平時間2.87us
  21.                  循環次數為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總線發送一組數據
  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)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色a级一级片 | 欧美久久精品一级c片 | www.成人在线视频 | 久久综合伊人 | 521av网站 | 欧美日韩免费一区二区三区 | 国产亚洲欧美另类一区二区三区 | 日韩欧美国产一区二区 | 欧美日日 | 日本 欧美 国产 | 日韩毛片网 | 91.com视频| 欧美一区二区大片 | 北条麻妃一区二区三区在线观看 | 97精品久久| 亚洲欧美日韩电影 | 日韩一区二区福利 | 精品在线一区 | 久久精品国产亚洲 | 久久久久国产成人精品亚洲午夜 | 久久中文网| 97国产精品 | 婷婷二区| 国产日韩欧美二区 | 成人免费看电影 | 亚洲www啪成人一区二区 | 欧美久久久久久 | 亚洲欧美成人在线 | 综合一区二区三区 | 青草久久免费视频 | 欧美激情在线播放 | 国产欧美一区二区三区在线看蜜臀 | 精品国产免费人成在线观看 | 久久免费香蕉视频 | 欧美三级成人理伦 | 99热首页| 成人免费视频网站在线观看 | 在线观看成人免费视频 | 一区二区日本 | 欧美极品在线 | 中文字幕在线一区二区三区 |