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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32 i2c IO代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:818684 發表于 2022-12-4 22:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  
  1. #include "i2c_analog.h"
  2.     #include "stm32f0xx.h"
  3.     #include "delay.h"
  4.     #define SHT30I2C_SCL GPIO_Pin_0
  5.     #define SHT30I2C_SDA GPIO_Pin_1
  6.     #define GPIO_I2C GPIOA
  7.     #define I2C_SCL_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SCL)
  8.     #define I2C_SCL_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SCL)
  9.     #define I2C_SDA_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SDA)
  10.     #define I2C_SDA_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SDA)
  11.     //use analog io
  12.     /*
  13.     PA3--------SDA
  14.     PA4--------SCLK
  15.     */
  16.     #define BIT32_SET(reg,pin,value) (reg = ((reg & ~(0x00000003 << (pin * 2))) | (value << (pin * 2))))//reg:寄存器 pin:管教號 value:參考手冊上的設定值
  17.     #define DS18B20_IO_IN()                                 BIT32_SET(GPIOA->MODER,1,0x00)//GPIOA_3模式:輸人                                                                                        00: 輸入模式( 復位狀態)        01: 通用輸出模式        10: 復用功能模式        11: 模擬模式
  18.     #define DS18B20_IO_OUT()                                 BIT32_SET(GPIOA->MODER,1,0x01)//GPIOA_3模式:輸出        
  19.     static void I2C_SDA_OUT(void)
  20.     {
  21.     //                GPIO_InitTypeDef GPIO_InitStructure;        
  22.     //               
  23.     //                GPIO_InitStructure.GPIO_Pin=SHT30I2C_SDA;
  24.     // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  25.     //                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  26.     //                GPIO_Init(GPIOA,&GPIO_InitStructure);        
  27.     DS18B20_IO_OUT();
  28.     }
  29.     static void I2C_SDA_IN(void)
  30.     {
  31.     //                GPIO_InitTypeDef GPIO_InitStructure;        
  32.     //               
  33.     //                GPIO_InitStructure.GPIO_Pin = SHT30I2C_SDA;
  34.     // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  35.     //                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  36.     //                GPIO_Init(GPIOA,&GPIO_InitStructure);
  37.     DS18B20_IO_IN();
  38.     }
  39.     void IIC_GPIOInit(void)
  40.     {                                       
  41.     GPIO_InitTypeDef GPIO_InitStructure;
  42.     /* 使能GPIOA時鐘 */
  43.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  44.     /* 配置LED相應引腳PB1*/
  45.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  46.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  47.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  48.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  49.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  50.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  51.     I2C_SCL_H;
  52.     I2C_SDA_H;
  53.     //GPIO_SetBits(GPIOA,GPIO_Pin_3); //輸出A3
  54.     // GPIO_SetBits(GPIOA,GPIO_Pin_4); //輸出A3
  55.     }
  56.     #define I2C_DELAY_CLK 2 //3
  57.     //產生IIC起始信號:
  58.     void IIC_Start(void)
  59.     {
  60.     I2C_SDA_OUT();
  61.             
  62.             I2C_SDA_H;
  63.             I2C_SCL_H;
  64.             //delay_us(I2C_DELAY_CLK);
  65.             I2C_SDA_L;
  66.             //delay_us(I2C_DELAY_CLK);
  67.             I2C_SCL_L;
  68.             //delay_us(I2C_DELAY_CLK);
  69.     }        
  70.     //產生IIC停止信號
  71.     void IIC_Stop(void)
  72.     {
  73.     I2C_SDA_OUT();
  74.     I2C_SCL_L;
  75.     I2C_SDA_L;
  76.     I2C_SCL_H;
  77.     //delay_us(I2C_DELAY_CLK);
  78.     I2C_SDA_H;
  79.     //delay_us(I2C_DELAY_CLK);                                                        
  80.     }
  81.     //產生ACK應答
  82.     void IIC_Ack(void)
  83.     {
  84.     I2C_SCL_L;
  85.     I2C_SDA_OUT();
  86.     I2C_SDA_L;
  87.     //delay_us(2);
  88.     I2C_SCL_H;
  89.     //delay_us(I2C_DELAY_CLK);
  90.     I2C_SCL_L;
  91.     }
  92.     //不產生ACK應答               
  93.     void IIC_NAck(void)
  94.     {
  95.     I2C_SCL_L;
  96.     I2C_SDA_OUT();
  97.     I2C_SDA_H;
  98.     //delay_us(2);
  99.     I2C_SCL_H;
  100.     //delay_us(I2C_DELAY_CLK);
  101.     I2C_SCL_L;
  102.     }        
  103.     void i2c_send_ack()
  104.     {
  105.     I2C_SCL_L;        
  106.             // delay_us(I2C_DELAY_CLK);
  107.     I2C_SDA_H;
  108.     I2C_SDA_OUT();
  109.             // delay_us(I2C_DELAY_CLK);
  110.     I2C_SCL_H;        
  111.             // delay_us(I2C_DELAY_CLK);
  112.     I2C_SCL_L;        
  113.             // delay_us(I2C_DELAY_CLK);
  114.     }
  115.     uint8_t i2c_read_ack(void)
  116.     {
  117.     I2C_SCL_L;
  118.     I2C_SDA_IN(); //SDA設置為輸入
  119.     // delay_us(I2C_DELAY_CLK);
  120.     I2C_SCL_H;        
  121.     //delay_us(2);
  122.     if(GPIO_ReadInputDataBit(GPIO_I2C, SHT30I2C_SDA))
  123.     {
  124.     I2C_SCL_L;
  125.     //delay_us(I2C_DELAY_CLK);
  126.     return 1;
  127.     }
  128.     else
  129.     {
  130.     I2C_SCL_L;
  131.     //delay_us(I2C_DELAY_CLK);
  132.     return 0;                        
  133.     }
  134.     }
  135.     //IIC發送一個字節
  136.     //返回從機有無應答
  137.     //1,有應答
  138.     //0,無應答                        
  139.     void IIC_Send_Byte(uint8_t txd)
  140.     {
  141.                     uint8_t i=0;
  142.                     I2C_SDA_OUT();
  143.                     I2C_SCL_L;//拉低時鐘開始數據傳輸
  144.                     for(i=0;i<8;i++)
  145.                     {
  146.                                     if((txd&0x80)>0) //0x80 1000 0000
  147.                                                     I2C_SDA_H;
  148.                                     else
  149.                                                     I2C_SDA_L;
  150.                                     txd<<=1;
  151.                                     I2C_SCL_H;
  152.                                     //delay_us(I2C_DELAY_CLK); //發送數據
  153.                                     I2C_SCL_L;
  154.                                     //delay_us(I2C_DELAY_CLK);
  155.                     }
  156.     //        i2c_read_ack();
  157.     }         
  158.     //讀1個字節,ack=1時,發送ACK,ack=0,發送nACK
  159.     uint8_t IIC_Read_Byte(uint8_t ack)
  160.     {
  161.                     uint8_t i=0,receive=0;
  162.                     I2C_SDA_IN();
  163.                     for(i=0;i<8;i++)
  164.                     {
  165.                                     I2C_SCL_L;
  166.                             //        delay_us(I2C_DELAY_CLK); //origin 4
  167.                                     I2C_SCL_H;
  168.                                     receive<<=1;
  169.                                     if(GPIO_ReadInputDataBit(GPIO_I2C,SHT30I2C_SDA))
  170.                                     receive++;
  171.                             //        delay_us(I2C_DELAY_CLK);        
  172.                     }
  173.                     if(ack==0)
  174.                                     IIC_NAck();
  175.                     else
  176.                                     IIC_Ack();
  177.                     return receive;
  178.     }
復制代碼





#ifndef _I2C_ANALOG_H_
#define _I2C_ANALOG_H_
#include
void IIC_GPIOInit(void);
void IIC_Send_Byte(uint8_t txd);
uint8_t IIC_Read_Byte(uint8_t ack);
uint8_t i2c_read_ack(void);
void i2c_send_ack();
void IIC_NAck(void);
void IIC_Ack(void);
void IIC_Stop(void);
void IIC_Start(void);
#endif
使用模擬的IO 來實現I2C接口
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美色人| 亚洲精品一区中文字幕 | 成人av一区 | 中文字幕人成乱码在线观看 | 天天噜天天干 | 午夜男人的天堂 | 日韩一区精品 | 欧美一级视频免费看 | 国产精品www | 99久久久久国产精品免费 | 久久久人成影片免费观看 | 午夜视频在线免费观看 | 中文字幕国产 | 日本在线网站 | 影音av | 亚洲小视频在线观看 | 免费激情 | 精品久久久网站 | 国产免费观看一级国产 | 成人精品一区二区 | 欧美在线视频a | 国产综合一区二区 | 特级丰满少妇一级aaaa爱毛片 | 成人免费视频观看 | 欧美一区精品 | 亚洲综合婷婷 | 精品蜜桃一区二区三区 | 日韩av在线免费 | 欧美日在线| 日韩欧美三级电影 | 亚洲精品久久视频 | 中国美女撒尿txxxxx视频 | 午夜影视大全 | 一区二区三区在线 | 欧 | 黑人成人网 | av日韩一区 | 欧美亚洲国语精品一区二区 | 欧洲妇女成人淫片aaa视频 | 日日夜夜操天天干 | 日韩国产中文字幕 | 一区二区三区四区在线 |