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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

STM32軟件IIC SPI程序 方便移植

  [復(fù)制鏈接]
ID:367592 發(fā)表于 2019-3-23 11:37 | 顯示全部樓層 |閱讀模式
提供軟IIC隨意移植隨意改接口
眾所周知 stm32的硬件iIC協(xié)議不好用
0.png 99999.png
單片機(jī)源程序如下:
  1. #include "myiic.h"
  2. #include "delay.h"

  3. //已刪除所有延時(shí) 1 - 2us延時(shí)        若IIC通信出錯(cuò)或許是沒(méi)有延時(shí)問(wèn)題
  4. //或者時(shí)鐘源問(wèn)題

  5. void IIC_Init()
  6. {
  7.         GPIO_InitTypeDef  GPIO_InitStructure;
  8. /****************************IIC_SDA初始化***********************************************/
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_IIC_SDA_PORT, ENABLE);        //使能SDA連接端口時(shí)鐘   /
  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);                                                                 //根據(jù)設(shè)定參數(shù)初始化SDA /
  14. /****************************IIC_SCL初始化***********************************************/
  15.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_IIC_SCL_PORT, ENABLE);        //使能SCL連接端口時(shí)鐘          /
  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);                                                                 //根據(jù)設(shè)定參數(shù)初始化SCL /
  20. /****************************************************************************************/
  21. }


  22. /**********************************************/
  23. //                                                IIC Start
  24. //開(kāi)始信號(hào):在SCL為高電平時(shí),SDA由高電平向低電平跳變,開(kāi)始傳輸數(shù)據(jù)。
  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. //結(jié)束信號(hào):在SCL為高電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳輸數(shù)據(jù)。
  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主機(jī)產(chǎn)生ACK應(yīng)答信號(hào)
  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主機(jī)不產(chǎn)生ACK應(yīng)答信號(hào)
  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. //等待應(yīng)答信號(hào)到來(lái)
  78. //返回值        1,接收應(yīng)答失敗
  79. //        0,接收應(yīng)答成功
  80. /**********************************************/
  81. unsigned char IIC_Wait_Ack(void)
  82. {
  83.         u8 ucErrTime=0;
  84.         SDA_IN();      //SDA設(shè)置為輸入  
  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;//時(shí)鐘輸出0           
  98.         return 0;  
  99. }

  100. /**********************************************
  101. //                                                 IIC Write byte
  102. //IIC寫(xiě)一個(gè)字節(jié)          
  103. **********************************************/
  104. void IIC_Write_Byte(unsigned char data)
  105. {
  106.         unsigned char i;   
  107.         SDA_OUT();             
  108.         IIC_SCL=0;//拉低時(shí)鐘開(kāi)始數(shù)據(jù)傳輸
  109.         for(i=0;i<8;i++)
  110.         {              
  111.     IIC_SDA=(data&0x80)>>7;
  112.     data=data<<1;           
  113. //                delay_us(2);   //對(duì)TEA5767芯片這三個(gè)延時(shí)都是必須的
  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位) + 讀寫(xiě)位(讀1寫(xiě)0)
  128.         IIC_Wait_Ack();       
  129.   IIC_Write_Byte(Reg_addr);                                                //要寫(xiě)入數(shù)據(jù)的寄存器地址
  130.         IIC_Wait_Ack();       
  131.   IIC_Write_Byte(data);
  132.         IIC_Wait_Ack();       
  133.   IIC_Stop();
  134. }

  135. /**********************************************
  136. //                                                 IIC Read byte
  137. //IIC讀一個(gè)字節(jié)          
  138. //讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK   
  139. **********************************************/
  140. unsigned char IIC_Read_Byte(unsigned char Ack_EN)
  141. {
  142.         unsigned char i,receive=0;
  143.         SDA_IN();//SDA設(shè)置為輸入
  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();//發(fā)送nACK
  155.     else
  156.         IIC_ACK(); //發(fā)送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位) + 讀寫(xiě)位(寫(xiě)0)
  167.         IIC_Wait_Ack();       
  168.   IIC_Write_Byte(Reg_addr);                                                //要讀數(shù)據(jù)的寄存器地址
  169.         IIC_Wait_Ack();       
  170.   IIC_Start();
  171.         SDA_IN();
  172.   IIC_Write_Byte(Device_addr | 0x01);        //器件地址(7位) + 讀寫(xiě)位(讀1)
  173.         IIC_Wait_Ack();       
  174.         receive=IIC_Read_Byte(0);
  175.         IIC_Wait_Ack();       
  176.   IIC_Stop();
  177.         return receive;
  178. }
復(fù)制代碼

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

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:970124 發(fā)表于 2021-11-6 19:10 | 顯示全部樓層
是不同芯片之間的嗎
回復(fù)

使用道具 舉報(bào)

ID:979629 發(fā)表于 2021-11-10 07:56 | 顯示全部樓層
不同芯片之間稍加修改就可以通用嗎?
回復(fù)

使用道具 舉報(bào)

ID:194006 發(fā)表于 2021-12-1 08:02 來(lái)自手機(jī) | 顯示全部樓層
正需要,不知能不能移植到51上
回復(fù)

使用道具 舉報(bào)

ID:154680 發(fā)表于 2023-5-22 17:13 | 顯示全部樓層

正需要,不知能不能移植到51上
回復(fù)

使用道具 舉報(bào)

ID:1018021 發(fā)表于 2023-6-26 10:17 | 顯示全部樓層
正在學(xué)習(xí)i2c,感謝樓主
回復(fù)

使用道具 舉報(bào)

ID:461428 發(fā)表于 2023-11-12 18:29 | 顯示全部樓層
/SDA IO方向設(shè)置
#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狀態(tài)讀取


請(qǐng)問(wèn)下。GPIO7的口改變輸入狀態(tài)是GPIOB->CRH&=0XFFFFFFF0;GPIOA->CRH|=8<<7;???這個(gè)不應(yīng)該是GPIO-8咩???怎么后面又是GPIOA??.求大神賜教。謝謝
回復(fù)

使用道具 舉報(bào)

ID:821429 發(fā)表于 2023-11-17 12:31 | 顯示全部樓層
學(xué)習(xí)了。不過(guò)總聽(tīng)說(shuō)芯片IIC不好用,具體什么原因?原本認(rèn)為用現(xiàn)成的硬件比較方便  
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久亚洲成人 | 99久久精品国产一区二区三区 | 国产成人精品一区二区三区在线 | 国产在线精品一区二区三区 | 黄色免费网 | 亚洲精品在线视频 | 欧美一区二区三区在线观看 | 五月激情综合 | 国产二区视频 | 成人精品视频99在线观看免费 | 欧美美女爱爱 | 91视频麻豆 | 久久久99精品免费观看 | 成人做爰9片免费看网站 | 免费一看一级毛片 | 在线观看日本高清二区 | 日韩在线中文 | 69性欧美高清影院 | 久久久久国产精品一区二区 | 成人国产精品免费观看 | 国产一区二区精品在线观看 | 欧美一级小视频 | 国产亚洲精品久久久久久牛牛 | 日日摸日日添日日躁av | 国产一区二区精品在线观看 | 最新中文字幕在线 | 91精品国产一区二区在线观看 | 国产综合网站 | 一区二区三区小视频 | 91成人在线 | 成人动漫视频网站 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 中文字幕欧美一区二区 | 三级特黄特色视频 | 国产九九av | 成人免费片| 成人在线中文字幕 | 国产999精品久久久久久 | 国产精品成av人在线视午夜片 | 男人影音 | 亚洲精品一区二区三区蜜桃久 |