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

標題: STM32軟件IIC SPI程序 方便移植 [打印本頁]

作者: AA9527    時間: 2019-3-23 11:37
標題: STM32軟件IIC SPI程序 方便移植
提供軟IIC隨意移植隨意改接口
眾所周知 stm32的硬件iIC協議不好用

單片機源程序如下:
  1. #include "myiic.h"
  2. #include "delay.h"

  3. //已刪除所有延時 1 - 2us延時        若IIC通信出錯或許是沒有延時問題
  4. //或者時鐘源問題

  5. void IIC_Init()
  6. {
  7.         GPIO_InitTypeDef  GPIO_InitStructure;
  8. /****************************IIC_SDA初始化***********************************************/
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_IIC_SDA_PORT, ENABLE);        //使能SDA連接端口時鐘   /
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_SDA;                                                                                //SDA端口配置                                           /
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                          //推挽輸出                                                         /
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                        //IO口速度為50MHz                                 /
  13.         GPIO_Init(GPIO_SDA_PORT, &GPIO_InitStructure);                                                                 //根據設定參數初始化SDA /
  14. /****************************IIC_SCL初始化***********************************************/
  15.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_IIC_SCL_PORT, ENABLE);        //使能SCL連接端口時鐘          /
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_SCL;                                                                                //SCL端口配置                                                 /
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                          //推挽輸出                                                         /
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                        //IO口速度為50MHz                                 /
  19.         GPIO_Init(GPIO_SCL_PORT, &GPIO_InitStructure);                                                                 //根據設定參數初始化SCL /
  20. /****************************************************************************************/
  21. }


  22. /**********************************************/
  23. //                                                IIC Start
  24. //開始信號:在SCL為高電平時,SDA由高電平向低電平跳變,開始傳輸數據。
  25. /**********************************************/
  26. void IIC_Start()
  27. {
  28.         SDA_OUT();
  29.         IIC_SCL=1;
  30.         IIC_SDA=1;
  31.         delay_us(2);
  32.         IIC_SDA=0;
  33.         delay_us(2);
  34.         IIC_SCL=0;
  35. }


  36. /**********************************************/
  37. //                                                IIC Stop
  38. //結束信號:在SCL為高電平時,SDA由低電平向高電平跳變,結束傳輸數據。
  39. /**********************************************/
  40. void IIC_Stop()
  41. {
  42.         SDA_OUT();
  43.         IIC_SCL=1;
  44.         IIC_SDA=0;
  45.         delay_us(2);
  46.         IIC_SDA=1;
  47.         delay_us(2);

  48. }

  49. /**********************************************/
  50. //                                                IIC主機產生ACK應答信號
  51. /**********************************************/
  52. void IIC_ACK(void)
  53. {
  54.         SDA_OUT();
  55.         IIC_SCL=0;
  56.         IIC_SDA=0;
  57.         delay_us(2);
  58.         IIC_SCL=1;
  59.         delay_us(2);
  60.         IIC_SCL=0;
  61. }

  62. /**********************************************/
  63. //                                                IIC主機不產生ACK應答信號
  64. /**********************************************/
  65. void IIC_NACK(void)

  66. {
  67.         SDA_OUT();
  68.         IIC_SCL=0;
  69.         IIC_SDA=1;
  70.         delay_us(2);
  71.         IIC_SCL=1;
  72.         delay_us(2);
  73.         IIC_SCL=0;
  74. }


  75. /**********************************************/
  76. //                                                IIC Wait Ack
  77. //等待應答信號到來
  78. //返回值        1,接收應答失敗
  79. //        0,接收應答成功
  80. /**********************************************/
  81. unsigned char IIC_Wait_Ack(void)
  82. {
  83.         u8 ucErrTime=0;
  84.         SDA_IN();      //SDA設置為輸入  
  85.         IIC_SDA=1;
  86.         IIC_SCL=1;
  87.         delay_us(2);
  88.         while(READ_SDA)
  89.         {
  90.                 ucErrTime++;       
  91.                 if(ucErrTime>250)
  92.                         {
  93.                                 IIC_Stop();
  94.                                 return 1;
  95.                         }
  96.         }
  97.         IIC_SCL=0;//時鐘輸出0           
  98.         return 0;  
  99. }

  100. /**********************************************
  101. //                                                 IIC Write byte
  102. //IIC寫一個字節          
  103. **********************************************/
  104. void IIC_Write_Byte(unsigned char data)
  105. {
  106.         unsigned char i;   
  107.         SDA_OUT();             
  108.         IIC_SCL=0;//拉低時鐘開始數據傳輸
  109.         for(i=0;i<8;i++)
  110.         {              
  111.     IIC_SDA=(data&0x80)>>7;
  112.     data=data<<1;           
  113. //                delay_us(2);   //對TEA5767芯片這三個延時都是必須的
  114.                 IIC_SCL=1;
  115. //        delay_us(2);
  116.                 IIC_SCL=0;       
  117. //        delay_us(2);
  118.         }
  119. }

  120. /**********************************************
  121. // IIC Write Data
  122. **********************************************/
  123. void IIC_Write_Data(unsigned char Device_addr,unsigned char Reg_addr,unsigned char data)
  124. {
  125.   IIC_Start();
  126.         SDA_OUT();
  127.   IIC_Write_Byte(Device_addr | 0x00);        //器件地址(7位) + 讀寫位(讀1寫0)
  128.         IIC_Wait_Ack();       
  129.   IIC_Write_Byte(Reg_addr);                                                //要寫入數據的寄存器地址
  130.         IIC_Wait_Ack();       
  131.   IIC_Write_Byte(data);
  132.         IIC_Wait_Ack();       
  133.   IIC_Stop();
  134. }

  135. /**********************************************
  136. //                                                 IIC Read byte
  137. //IIC讀一個字節          
  138. //讀1個字節,ack=1時,發送ACK,ack=0,發送nACK   
  139. **********************************************/
  140. unsigned char IIC_Read_Byte(unsigned char Ack_EN)
  141. {
  142.         unsigned char i,receive=0;
  143.         SDA_IN();//SDA設置為輸入
  144.         for(i=0;i<8;i++ )
  145.         {
  146.                 IIC_SCL=0;
  147.                 delay_us(2);
  148.                 IIC_SCL=1;
  149.                 receive<<=1;
  150.     if(READ_SDA)receive++;   
  151.                 delay_us(1);
  152.    }                                         
  153.     if (!Ack_EN)
  154.         IIC_NACK();//發送nACK
  155.     else
  156.         IIC_ACK(); //發送ACK   
  157.     return receive;
  158. }


  159. /**********************************************
  160. // IIC Read Data
  161. **********************************************/
  162. unsigned char IIC_Read_Data(unsigned char Device_addr,unsigned char Reg_addr,unsigned char ACK_EN)
  163. {
  164.         unsigned char receive;
  165.         IIC_Start();
  166.   IIC_Write_Byte(Device_addr | 0x00);        //器件地址(7位) + 讀寫位(寫0)
  167.         IIC_Wait_Ack();       
  168.   IIC_Write_Byte(Reg_addr);                                                //要讀數據的寄存器地址
  169.         IIC_Wait_Ack();       
  170.   IIC_Start();
  171.         SDA_IN();
  172.   IIC_Write_Byte(Device_addr | 0x01);        //器件地址(7位) + 讀寫位(讀1)
  173.         IIC_Wait_Ack();       
  174.         receive=IIC_Read_Byte(0);
  175.         IIC_Wait_Ack();       
  176.   IIC_Stop();
  177.         return receive;
  178. }
復制代碼

所有資料51hei提供下載:
IIC.zip (2.18 KB, 下載次數: 72)



作者: QYH196114    時間: 2021-11-6 19:10
是不同芯片之間的嗎
作者: WQH14982678    時間: 2021-11-10 07:56
不同芯片之間稍加修改就可以通用嗎?
作者: kavin21513    時間: 2021-12-1 08:02
正需要,不知能不能移植到51上
作者: baozi123    時間: 2023-5-22 17:13

正需要,不知能不能移植到51上
作者: xxxx13    時間: 2023-6-26 10:17
正在學習i2c,感謝樓主
作者: kissme    時間: 2023-11-12 18:29
/SDA IO方向設置
#define SDA_IN()  {GPIOB->CRH&=0XFFFFFFF0;GPIOA->CRH|=8<<7;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFFF0;GPIOA->CRH|=3<<7;}

#define IIC_SCL                PBout(6)//SCL
#define IIC_SDA                PBout(7)//SDA
#define        READ_SDA        PBin(7)        //SDA狀態讀取


請問下。GPIO7的口改變輸入狀態是GPIOB->CRH&=0XFFFFFFF0;GPIOA->CRH|=8<<7;???這個不應該是GPIO-8咩???怎么后面又是GPIOA??.求大神賜教。謝謝
作者: liixaofei5    時間: 2023-11-17 12:31
學習了。不過總聽說芯片IIC不好用,具體什么原因?原本認為用現成的硬件比較方便  




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产欧美一区二区精品性色超碰 | 欧美日韩 | 最新日韩在线 | 最新国产精品视频 | av手机版| 国产精品久久午夜夜伦鲁鲁 | 成人免费精品 | 黄色大片免费在线观看 | av一道本| 超碰在线中文字幕 | 国产无精乱码一区二区三区 | 午夜久久久久久 | 中文字幕高清在线 | 日本公妇乱偷中文字幕 | 国产香蕉av | 999免费视频 | 91精品国产麻豆国产自产在线 | 亚洲天堂久久久 | 欧美日韩精品久久久免费观看 | 中文字幕日韩视频 | 久操精品 | 亚洲成年人在线观看 | 伊人成人在线视频 | 亚洲久久久 | 97超碰在线播放 | 成人福利网 | 天天射天天干天天操 | 午夜时刻免费入口 | 欧美精品二区三区四区免费看视频 | 亚洲国产日韩欧美 | 国产欧美另类 | 欧美一级全黄 | 国产黄色一区二区 | 欧美视频在线观看免费 | 日本中文在线观看 | 久久久在线 | 我想看毛片 | 天天爽夜夜爽夜夜爽精品视频 | 欧美在线视频一区二区 | 91亚洲精品在线 | 毛片视频免费 |