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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2984|回復: 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. }
復制代碼


回復

使用道具 舉報

ID:275111 發表于 2020-4-1 10:54 | 顯示全部樓層
謝謝調試經驗的分享,目前在調試硬件模塊I2C,頭大。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线观看视频网站 | 射久久 | 99热这里 | 欧美二区乱c黑人 | av免费网站在线观看 | 一级二级三级在线观看 | www.黄色在线观看 | 中文无吗 | 日本欧美在线视频 | 欧美精品一二区 | 中文字幕不卡在线观看 | 久久av一区二区三区 | 成人福利在线观看 | 国产一区二区激情视频 | 久久久久免费观看 | 免费看黄视频网站 | 日韩在线观看一区 | 亚洲福利一区 | 成人av电影天堂 | 久久久91精品国产一区二区三区 | h片在线播放 | 精品国产网 | 毛片一区二区三区 | 中文字幕一级 | 亚洲国产一区视频 | 亚洲成色777777在线观看影院 | 久久国产免费 | 91精品国产乱码久久久久久 | 久草在线| 国产在线视频在线观看 | 色啪网 | 视频一区在线播放 | 亚洲一区二区日韩 | 做a视频在线观看 | 伊人中文字幕 | 中文字幕精品一区 | 国产剧情一区 | 久久综合爱 | 一区影院 | 欧美亚洲视频 | 午夜精品久久久久久久久久久久久 |