- #include "i2c_analog.h"
- #include "stm32f0xx.h"
- #include "delay.h"
- #define SHT30I2C_SCL GPIO_Pin_0
- #define SHT30I2C_SDA GPIO_Pin_1
- #define GPIO_I2C GPIOA
- #define I2C_SCL_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SCL)
- #define I2C_SCL_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SCL)
- #define I2C_SDA_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SDA)
- #define I2C_SDA_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SDA)
- //use analog io
- /*
- PA3--------SDA
- PA4--------SCLK
- */
- #define BIT32_SET(reg,pin,value) (reg = ((reg & ~(0x00000003 << (pin * 2))) | (value << (pin * 2))))//reg:寄存器 pin:管教號 value:參考手冊上的設定值
- #define DS18B20_IO_IN() BIT32_SET(GPIOA->MODER,1,0x00)//GPIOA_3模式:輸人 00: 輸入模式( 復位狀態) 01: 通用輸出模式 10: 復用功能模式 11: 模擬模式
- #define DS18B20_IO_OUT() BIT32_SET(GPIOA->MODER,1,0x01)//GPIOA_3模式:輸出
- static void I2C_SDA_OUT(void)
- {
- // GPIO_InitTypeDef GPIO_InitStructure;
- //
- // GPIO_InitStructure.GPIO_Pin=SHT30I2C_SDA;
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- // GPIO_Init(GPIOA,&GPIO_InitStructure);
- DS18B20_IO_OUT();
- }
- static void I2C_SDA_IN(void)
- {
- // GPIO_InitTypeDef GPIO_InitStructure;
- //
- // GPIO_InitStructure.GPIO_Pin = SHT30I2C_SDA;
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- // GPIO_Init(GPIOA,&GPIO_InitStructure);
- DS18B20_IO_IN();
- }
- void IIC_GPIOInit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- /* 使能GPIOA時鐘 */
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
- /* 配置LED相應引腳PB1*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- I2C_SCL_H;
- I2C_SDA_H;
- //GPIO_SetBits(GPIOA,GPIO_Pin_3); //輸出A3
- // GPIO_SetBits(GPIOA,GPIO_Pin_4); //輸出A3
- }
- #define I2C_DELAY_CLK 2 //3
- //產生IIC起始信號:
- void IIC_Start(void)
- {
- I2C_SDA_OUT();
-
- I2C_SDA_H;
- I2C_SCL_H;
- //delay_us(I2C_DELAY_CLK);
- I2C_SDA_L;
- //delay_us(I2C_DELAY_CLK);
- I2C_SCL_L;
- //delay_us(I2C_DELAY_CLK);
- }
- //產生IIC停止信號
- void IIC_Stop(void)
- {
- I2C_SDA_OUT();
- I2C_SCL_L;
- I2C_SDA_L;
- I2C_SCL_H;
- //delay_us(I2C_DELAY_CLK);
- I2C_SDA_H;
- //delay_us(I2C_DELAY_CLK);
- }
- //產生ACK應答
- void IIC_Ack(void)
- {
- I2C_SCL_L;
- I2C_SDA_OUT();
- I2C_SDA_L;
- //delay_us(2);
- I2C_SCL_H;
- //delay_us(I2C_DELAY_CLK);
- I2C_SCL_L;
- }
- //不產生ACK應答
- void IIC_NAck(void)
- {
- I2C_SCL_L;
- I2C_SDA_OUT();
- I2C_SDA_H;
- //delay_us(2);
- I2C_SCL_H;
- //delay_us(I2C_DELAY_CLK);
- I2C_SCL_L;
- }
- void i2c_send_ack()
- {
- I2C_SCL_L;
- // delay_us(I2C_DELAY_CLK);
- I2C_SDA_H;
- I2C_SDA_OUT();
- // delay_us(I2C_DELAY_CLK);
- I2C_SCL_H;
- // delay_us(I2C_DELAY_CLK);
- I2C_SCL_L;
- // delay_us(I2C_DELAY_CLK);
- }
- uint8_t i2c_read_ack(void)
- {
- I2C_SCL_L;
- I2C_SDA_IN(); //SDA設置為輸入
- // delay_us(I2C_DELAY_CLK);
- I2C_SCL_H;
- //delay_us(2);
- if(GPIO_ReadInputDataBit(GPIO_I2C, SHT30I2C_SDA))
- {
- I2C_SCL_L;
- //delay_us(I2C_DELAY_CLK);
- return 1;
- }
- else
- {
- I2C_SCL_L;
- //delay_us(I2C_DELAY_CLK);
- return 0;
- }
- }
- //IIC發送一個字節
- //返回從機有無應答
- //1,有應答
- //0,無應答
- void IIC_Send_Byte(uint8_t txd)
- {
- uint8_t i=0;
- I2C_SDA_OUT();
- I2C_SCL_L;//拉低時鐘開始數據傳輸
- for(i=0;i<8;i++)
- {
- if((txd&0x80)>0) //0x80 1000 0000
- I2C_SDA_H;
- else
- I2C_SDA_L;
- txd<<=1;
- I2C_SCL_H;
- //delay_us(I2C_DELAY_CLK); //發送數據
- I2C_SCL_L;
- //delay_us(I2C_DELAY_CLK);
- }
- // i2c_read_ack();
- }
- //讀1個字節,ack=1時,發送ACK,ack=0,發送nACK
- uint8_t IIC_Read_Byte(uint8_t ack)
- {
- uint8_t i=0,receive=0;
- I2C_SDA_IN();
- for(i=0;i<8;i++)
- {
- I2C_SCL_L;
- // delay_us(I2C_DELAY_CLK); //origin 4
- I2C_SCL_H;
- receive<<=1;
- if(GPIO_ReadInputDataBit(GPIO_I2C,SHT30I2C_SDA))
- receive++;
- // delay_us(I2C_DELAY_CLK);
- }
- if(ack==0)
- IIC_NAck();
- else
- IIC_Ack();
- return receive;
- }
復制代碼
#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接口
|