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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于stm8調試硬件I2C經驗分享

[復制鏈接]
跳轉到指定樓層
樓主
ID:183246 發表于 2017-4-6 10:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      stm8不需要專門配置GPIO口,執行初始化就可以啦!有些stm8需要打開EEPROM設置I2C(看官方文檔)
       stm8主要靠SR1和SR3狀態寄存器判斷I2C的情況(while(!XXXXX)就是出自這里),多半大家調不通!就是卡在這里(需要注意的是 寄存器有些位,只要讀寄存器就可以清除,在仿真的時候,最好不要打開寄存器頁面)。這里分軟故障和硬故障:

       首先是硬故障: 一般是stm8芯片IO口壞啦,有些時候stm8能夠寫程序而且IO別的功能都是好的,單單是I2C用不起!還有就是IO上拉電壓不夠!我就遇到這樣的問題,我IO 加上邏輯分析儀后就可以調通,不加就通不了。這個也搞啦我很久。

       軟故障: 一般主要是設置CR1和CR2問題,只要按照我的參考程序設置就可以!

       我詳細的講講,寄存器I2c_CR2 應答使能位(位2)ack。首先是理解:官方文檔上面說的是ack應答使能,對是使能!很多人包括我自己 開始都認為是發送ack,導致每次stm8收到數據后,我們都手動在每次收到字節后加I2C_AcknowledgeConfig(I2C_ACK_CURR)無任何意義,因為在接收模式下,收到完整字節后,自動發送ack(提前是CR2 ack位使能,不需要專門CR2 ack位置1)   ,都是軟件虛擬I2C用多啦!想當然啦!
       還有就是使用這個ack!設置ACK都必須在接收字節前,也就是說為個在收到最后一個字節后產生一個NACK 脈沖,在讀倒數第二個數據字節之后,必須清除ack位(ack=0)!設置ack同理! 還有需要 主要的地方 如果設置 ack=0; 下次需要重新產生ack的時候!需要手動置位ack!記住在開始接收之前!如果你只有一個字節正確,后面全部是0xFF...可能就是這個問題(切記!切記!很多例子都沒有加上這句,包括風馳 的例子!! 不過 他沒有加循環! 如果他再循環一次就會出現問題。)

       隨便說說仿真調試!在調試過程中,最好不要打開I2C寄存器看!因為對寄存器的讀,也會造成寄存器有些位重置!直接按Go,然后暫停。進去程序看卡在那里啦。

      操作庫和寄存器編寫程序,其實沒有分別!不過為啦更好的理解,我在這里是操作寄存器!網上有人說加入中斷會對I2C產生影響,我這里沒有加中斷。希望有后來人補全!反正我這幾天運行沒有發現問題!

附錄1 主要I2C程序
  1. void Read_8816(u8 *pBuffer, u8 index, u8 NumByteToRead)
  2. {  
  3.   while(I2C->SR3 & 0x02);  //等待總線空閑   檢測i2c-SR3 busy位  
  4.   //以下見stm8s中文數據手冊P251(圖96主設備發送模式發送序列圖)
  5.   //S 起始條件
  6.   I2C->CR2 |= 0x01;  //產生起始位            CR2 start位      
  7.   //EV5:SB=1,讀SR1 然后將地址寫入DR寄存器將清除該標志。
  8.   while(!(I2C->SR1 & 0x01));  //等待START發送完 E5
  9.   //ADDRESS (發送模式)
  10.   I2C->DR = 0x00;  //發送MLX90615器件地址(最后一位是0,表示發送)
  11.   while(!(I2C->SR1 & 0x02));  //等特7位器件地址發送完并且收到ack,ADDR置1
  12. //EV6:ADDR 在軟件讀取SR1后,對SR3寄存器讀操作 將清除改位
  13. I2C->SR1; //見P251 讀SR1 (實驗證明可以不要)
  14. I2C->SR3; //然后讀SR3 清  ADDR(等于庫函數I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED))
  15.   //DATA 發送寄存器地址
  16.   I2C->DR = (u8)(index);
  17.   //EV8_2 TxE=1 ,BTF=1,產生停止條件時由硬件清除。
  18.   while(!(I2C->SR1 & 0x84));  //檢測SR1 TXE1 BTF位置(只有當stm8收到ack,TxE才會置1,其實這句相當于判斷收到ack沒有?)
  19.   //在發送地址和清除ADDR 之后,I2C接口進入主設備接收模式。以下見stm8s中文數據手冊P252(圖97主設備接收模式接收序列圖)
  20.   //S 重復起始條件
  21.   I2C->CR2 |= 0x01;  //產生重復起始位
  22.   //EV5:SB=1,讀SR1 然后將地址寫入DR寄存器將清除該標志。
  23.   while(!(I2C->SR1 & 0x01));  //等待START發送完
  24.   //ADDRESS (接收)
  25.   I2C->DR = 0x01;  //發送MLX90615器件地址(最后一位是1,表示接收),發送完后自動發送ack(提前是CR2 ack位使能)
  26.   //EV6:ADDR 在軟件讀取SR1后,對SR3寄存器讀操作 將清除改位
  27.   while(!(I2C->SR1 & 0x02));  //等特7位器件地址發送完并且收到ack,ADDR置1
  28. I2C->SR1; //見P251 讀SR1 (實驗證明可以不要)
  29. I2C->SR3; //然后讀SR3 清  ADDR(等于庫函數I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED))
  30. //循環讀取數據
  31.   while(NumByteToRead)  
  32.   {
  33.       //EV7_1 :RxNE=1 ,讀DR寄存器清除該標志。設置ACK=0和STOP 請求。(在接收最后一個字節前)
  34.         if(NumByteToRead == 1) //實驗證明在最后一個字節前后都一樣
  35.     {
  36.       I2C->CR2 &= ~0x04; //ack使能
  37.       I2C->CR2 |= 0x02;  //停止位產生stop
  38.     }
  39.       ///測試EV7 RxNE=1(收到一個字節后RxNE置1) ,判斷DR寄存器有數據
  40.     if(I2C->SR1 & 0x40)
  41.     {
  42.        *pBuffer=I2C->DR;//在接收模式下,收到完整字節后,自動發送ack(提前是CR2 ack位使能,不需要專門CR2 ack位置1)
  43.               //在風馳里面例子,在每次收到字節后加I2C_AcknowledgeConfig(I2C_ACK_CURR)無任何意義,
  44.        pBuffer++;  
  45.        NumByteToRead--;   
  46.     }   
  47.   }
  48. I2C->CR2 |= 0x04;//為一下循環開始 設置 ack使能,上面 EV7_1設置ack=0發送stop后;需要手動設置ack=1使能,必要在接收數據之前
  49. //切記!切記!很多例子都沒有加上這句,包括風馳 的例子! 不過 他沒有加循環! 如果他在循環一次就會出現問題。CR2 ack位其實就是使能的意思!!很多人都理解成需要手動設置!
  50. }
復制代碼


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

使用道具 舉報

沙發
ID:275111 發表于 2020-4-1 10:54 | 只看該作者
謝謝調試經驗的分享,目前在調試硬件模塊I2C,頭大。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: h片在线看 | 三级在线观看 | 作爱视频免费观看 | 欧美一级一 | 日韩av免费看 | 91精品国产一区二区三区蜜臀 | 鲁一鲁资源影视 | 欧美99 | 久久网站免费视频 | 欧美成人激情 | 国产精品视频一二三区 | 久久人人网 | 中文字幕一区二区三区不卡 | 久久久久中文字幕 | 天天操夜夜操 | 亚洲综合五月天婷婷 | 亚洲欧美日韩精品久久亚洲区 | 国产一区www| 日韩av中文 | 久久亚洲视频网 | 天天色官网 | 美女黄网| 亚洲一区二区免费 | 成人蜜桃av| 国产日韩欧美精品一区二区 | 777zyz色资源站在线观看 | 狠狠av | 国产精品一区二区三区四区五区 | 狠狠色网 | 黄色片免费在线观看 | 亚洲欧美日韩国产 | 久久久久久国产精品 | 久久久久久天堂 | 午夜av一区二区 | 精品久久久久久久久久久久 | 99精品久久久 | 亚洲精品一区国语对白 | 天堂视频一区 | 国产成人99久久亚洲综合精品 | 亚洲精品乱码 | 亚洲视频手机在线 |