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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8058|回復(fù): 7
收起左側(cè)

STM8S003F3關(guān)于IIC的STVD例子

[復(fù)制鏈接]
ID:287237 發(fā)表于 2018-3-3 18:35 | 顯示全部樓層 |閱讀模式
    STM8S003的IIC總是令人頭大。現(xiàn)在附上一個STVD的例子。驗證可以通過的

對于stm8,用庫函數(shù)操作,上手容易,但是有好也有壞。這次手頭上用到的是8S003這個芯片,如果上庫函數(shù),8M的內(nèi)存很快就會被消耗殆盡,所以只能上寄存器操作,其實自己本人是比較喜歡直接操作寄存器的,對于stm8來說,寄存器也不是特別的多,一個一個來配置也不是特別麻煩,對于底層,也能有一個較好的了解,而除了前邊所說的內(nèi)存優(yōu)勢,執(zhí)行效率也是有所差別。    stm8的iic,網(wǎng)上可謂是罵聲一片啊,哈哈,這次調(diào)試之后發(fā)現(xiàn)確實是不夠優(yōu)秀,操作繁瑣,而最重要的一點便是通訊速度的控制,通過對時鐘寄存器的操作,來選擇通訊速度,可是卻和通過手冊公式所計算出來的有很大差別,而最要命的一點是時鐘上升沿時間,在寄存器中有一控制上升時間的寄存器,可是實際中通過示波器觀察波形發(fā)現(xiàn)卻是沒有多大效果,或者說是沒有效果(我的電路連接是iic引腳掛載一個24C02從設(shè)備,上拉電阻4K7)。
  實際測試中,上升時間非常慢,對于100K的速度來說,這個上升時間太長了,再加上干擾或其他因素,極有可能大大降低通訊的可靠性。測試了一下,100K的速度,能正常驅(qū)動24C02(未長時間大數(shù)據(jù)量測試),而上400K的速度,通訊失敗是常有的事。而手冊中卻是說著支持100K和400K的速度,且還有寄存器位專門來設(shè)置400K速度下的配置,正常來說是應(yīng)該能上400K的速度才對。不知是否是我理解有誤,配置的不好...!
    誰弄過這個iic的,交流一下...!
    上傳我的工程文件,STVD,程序中各種while()的等待均沒有設(shè)置超時退出。
    程序是通過運行后在仿真窗口中觀察變量來確認對24C02的讀寫。

單片機源程序如下:
  1. /*

  2. STM8硬件IIC,不用庫的例子。  

  3. 有空想試試STM8的硬件IIC讀寫24C02,結(jié)果不像軟件模擬那么簡單。。

  4. 為了一步一步驗證讀寫程序,先用編程器把數(shù)據(jù)寫到EEPROM內(nèi)。然后就調(diào)試讀的程序。。。

  5. 漫漫長的一天。。。終于成功。

  6. */

  7. //記得配置選項字。

  8. //SDA,SCL要上拉4.7K-10K的電阻。。

  9. //相應(yīng)端口要配置成默認的浮動輸入。。。一定要。。

  10. void IIC_Init(void)
  11. {

  12. //I2C_FREQR和I2C_CCRL,CCRH ,I2C_TRISER要對應(yīng)fMASTER頻率計算。。但測試的效果來看好像又沒什么影響。


  13. I2C_FREQR |= 0x0c; //輸入外設(shè)時鐘頻率為11.0592MHz
  14. I2C_CR1    = 0x00; //禁止I2C外設(shè)

  15. I2C_TRISER = 0x0c;
  16. I2C_CCRL   = 0x37;
  17. I2C_CCRH   = 0x00;

  18. I2C_CR1   |= 0x01; //開啟I2C外設(shè)
  19. I2C_CR2   |= 0x04; //應(yīng)答使能

  20. I2C_OARL   = 0xfe;                  //自身地址
  21. I2C_OARH   = 0x40;
  22. }

  23. //讀寫之間插入3.5ms以上的延時,24C02寫的時候不能應(yīng)答。
  24. //寫24c02,參數(shù):地址,長度1-16,數(shù)據(jù)緩沖
  25. void Write_24c02(unsigned char address,unsigned char number,unsigned char *data)
  26. {
  27. unsigned char temp,i;

  28. I2C_CR2 &=~ 0x04; //不返回應(yīng)答

  29. while(I2C_SR3 & 0x02); //等待總線空閑

  30. I2C_CR2 |= 0x01; //產(chǎn)生起始位
  31. while(!(I2C_SR1 & 0x01)); //等待START發(fā)送完

  32. I2C_DR = 0xa0; //發(fā)24c02器件地址
  33. while(!(I2C_SR1 & 0x02)); //等特7位器件地址發(fā)送完
  34. temp = I2C_SR1;
  35. temp = I2C_SR3;

  36. I2C_DR = address;
  37. while(!(I2C_SR1 & 0x04));
  38. for(i=0;i<number;i++)
  39. {
  40.   I2C_DR = *(data+i);
  41.   while(!(I2C_SR1 & 0x04));
  42. }
  43. I2C_CR2 |= 0x02; //產(chǎn)生停止位
  44. I2C_CR2 |= 0x04; //返回應(yīng)答
  45. }

  46. //讀24C02,參數(shù):返回的字節(jié)緩沖,開始地址,要讀的字節(jié)數(shù)。
  47. void Read_24c02(unsigned char *pBuffer,unsigned char address,unsigned char Number)
  48. {
  49. unsigned char temp,r_data;
  50. while(I2C_SR3 & 0x02); //等待總線空閑

  51. I2C_CR2 |= 0x01; //產(chǎn)生起始位
  52. while(!(I2C_SR1 & 0x01)); //等待START發(fā)送完

  53. I2C_DR = 0xa0; //發(fā)24c02器件地址
  54. while(!(I2C_SR1 & 0x02)); //等特7位器件地址發(fā)送完
  55. temp = I2C_SR1;
  56. temp = I2C_SR3;
  57. I2C_DR = address;
  58. while(!(I2C_SR1 & 0x84));
  59. I2C_CR2 |= 0x01; //產(chǎn)生重復(fù)起始位
  60. while(!(I2C_SR1 & 0x01)); //等待START發(fā)送完

  61. I2C_DR = 0xa1; //讀
  62. while(!(I2C_SR1 & 0x02)); //等特7位器件地址發(fā)送完
  63. temp = I2C_SR1;
  64. temp = I2C_SR3;

  65. while(Number) //要讀幾個字節(jié)
  66. {
  67.   if(Number== 1)
  68.   {
  69.    I2C_CR2 &= ~0x04; //不返回應(yīng)答
  70.    I2C_CR2 |= 0x02; //產(chǎn)生停止位
  71.   }
  72.   if(I2C_SR1 & 0x40)
  73.   {
  74.    temp = I2C_SR1;
  75.    *pBuffer = I2C_DR;
  76.    pBuffer++;
  77.    Number--;
  78.   }
  79. }
  80. I2C_CR2 |= 0x04;
  81. I2C_CR2 &= ~0x08;
  82. }





  83. /////

  84. IIC_Init();

  85. Read_24c02(buffer,0x0f,5);
  86. for(i=0;i<5;i++)
  87. {
  88.    while(!(UART2_SR&0x80)); //檢測發(fā)送寄存器為空
  89.    UART2_DR = buffer[i];
  90.    while(!(UART2_SR&0x40)); //發(fā)送完成*/
  91. }  

  92. for(vti=0;vti<5000;vti++); //延時一段時間再讀呀。。。注意!!

  93. buffer[0]=0xaa;
  94. buffer[1]=0xbb;
  95. buffer[2]=0xcc;
  96. buffer[3]=0xdd;
  97. buffer[4]=0xee;



  98. Write_24c02(0x00,5,buffer);


  99. for(vti=0;vti<5000;vti++); //延時一段時間再讀呀。。。注意!!


  100. Read_24c02(buffer,0x00,5);
  101. for(i=0;i<5;i++)
  102. {
  103.    while(!(UART2_SR&0x80)); //檢測發(fā)送寄存器為空
  104.    UART2_DR = buffer[i];
  105.    while(!(UART2_SR&0x40)); //發(fā)送完成*/
  106. }  




  107. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  108. DE:IAR
  109. MCU:STM8S105C6
  110. 外設(shè)IC:PL1167(2.4GRF)
  111. 下面貢獻一下兩個關(guān)鍵函數(shù)
  112. void Write2Byte(u8 RomAddress,u8 v1,u8 v2)
  113. {
  114.   SS_ENABLE;
  115.   I2C_GenerateSTART(ENABLE);
  116.   while(!I2C_GetFlagStatus(I2C_FLAG_STARTDETECTION));
  117.   I2C_Send7bitAddress(DeviceAddress, I2C_DIRECTION_TX);
  118.   while(!I2C_GetFlagStatus(I2C_FLAG_ADDRESSSENTMATCHED));
  119.   I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);// must add
  120.   I2C_SendData(RomAddress);
  121.   while(!I2C_GetFlagStatus(I2C_FLAG_TXEMPTY));
  122.   I2C_SendData(v1);
  123.   while(!I2C_GetFlagStatus(I2C_FLAG_TXEMPTY));
  124.   I2C_SendData(v2);
  125.   while(!I2C_GetFlagStatus(I2C_FLAG_TRANSFERFINISHED));
  126.   I2C_GenerateSTOP(ENABLE);
  127.   SS_DISABLE;
  128. }

  129. u16 PL1167_Read2Byte(u8 RomAddress)
  130. {
  131.   u8 dat1,dat2;
  132.   u16 dat;
  133.   dat1=0;
  134.   dat2=0;
  135.   dat=0;
  136.   SS_ENABLE;
  137.   I2C_GenerateSTART(ENABLE);
  138.   while(!I2C_GetFlagStatus(I2C_FLAG_STARTDETECTION));
  139.   I2C_Send7bitAddress(DeviceAddress, I2C_DIRECTION_TX);
  140.   while(!I2C_GetFlagStatus(I2C_FLAG_ADDRESSSENTMATCHED));
  141. I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);// must add
  142.   I2C_SendData(RomAddress);
  143.   while(!I2C_GetFlagStatus(I2C_FLAG_TXEMPTY));
  144.   I2C_GenerateSTART(ENABLE);
  145.   while(!I2C_GetFlagStatus(I2C_FLAG_STARTDETECTION));  
  146.   I2C_Send7bitAddress(DeviceAddress, I2C_DIRECTION_RX);  
  147.   while(!I2C_GetFlagStatus(I2C_FLAG_ADDRESSSENTMATCHED));
  148.   I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);// must add
  149.   while(!I2C_GetFlagStatus(I2C_FLAG_RXNOTEMPTY));
  150.   I2C_AcknowledgeConfig(I2C_ACK_CURR);
  151.   dat1=I2C_ReceiveData();   
  152.   I2C_AcknowledgeConfig(I2C_ACK_NONE);
  153.   while(!I2C_GetFlagStatus(I2C_FLAG_RXNOTEMPTY));
  154.   dat2=I2C_ReceiveData();
  155.   I2C_GenerateSTOP(ENABLE);
  156.   dat|=dat1;
  157.   dat<<=8;
  158.   dat|=dat2;
  159.   SS_DISABLE;        
  160.   return dat;  
  161. }
復(fù)制代碼

所有資料51hei提供下載:
103244822STM8S-IIC.rar (51.92 KB, 下載次數(shù): 94)
回復(fù)

使用道具 舉報

ID:18916 發(fā)表于 2018-9-7 21:56 | 顯示全部樓層
頂一下
回復(fù)

使用道具 舉報

ID:158812 發(fā)表于 2018-9-7 23:28 | 顯示全部樓層
STVD還真是少用哦,一般都用IAR。
回復(fù)

使用道具 舉報

ID:251455 發(fā)表于 2018-12-5 11:13 | 顯示全部樓層
代碼收下,有空試試。謝謝樓主
回復(fù)

使用道具 舉報

ID:623319 發(fā)表于 2019-10-13 15:52 | 顯示全部樓層
正是我想?yún)⒖嫉拇a,多謝!
回復(fù)

使用道具 舉報

ID:282359 發(fā)表于 2020-3-13 10:49 | 顯示全部樓層
正是我想?yún)⒖嫉拇a,多謝!
回復(fù)

使用道具 舉報

ID:422715 發(fā)表于 2020-3-20 17:07 | 顯示全部樓層
過來學(xué)習(xí)一下
回復(fù)

使用道具 舉報

ID:833537 發(fā)表于 2023-11-17 16:47 | 顯示全部樓層
非常好,正是我想用的
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品毛片 | 亚洲国产成人精品久久 | 丝袜毛片 | 成人二区 | 一区二区日韩 | 伊人影院在线观看 | 999国产精品视频免费 | 欧美一区永久视频免费观看 | 国产一区 | 国产视频一视频二 | 男女精品久久 | 久久久久亚洲国产| 美女精品一区 | 中文字幕国产精品 | 久久9999久久| 国产资源网 | 第一福利社区1024 | 午夜久久久 | 国产精品亚洲二区 | 久久久久国产一区二区三区不卡 | 久久国产综合 | 日韩精品视频网 | 中文成人无字幕乱码精品 | 欧美激情在线精品一区二区三区 | www国产精品 | 在线视频91 | 99久久成人 | 81精品国产乱码久久久久久 | 激情黄色在线观看 | 99久久婷婷国产综合精品电影 | 99热最新| 成人欧美一区二区三区1314 | 激情婷婷成人 | 先锋资源网| 日韩精品一区二区三区四区视频 | 中文字幕蜜臀 | 国产视频第一页 | 91tv在线观看| 国产精品区二区三区日本 | 日韩一区二区三区四区五区六区 | 国产精品九九九 |