標(biāo)題:
STM32 i2c IO代碼
[打印本頁]
作者:
xiaoyewin
時(shí)間:
2022-12-4 22:26
標(biāo)題:
STM32 i2c IO代碼
#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:管教號(hào) value:參考手冊上的設(shè)定值
#define DS18B20_IO_IN() BIT32_SET(GPIOA->MODER,1,0x00)//GPIOA_3模式:輸人 00: 輸入模式( 復(fù)位狀態(tài)) 01: 通用輸出模式 10: 復(fù)用功能模式 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時(shí)鐘 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* 配置LED相應(yīng)引腳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
//產(chǎn)生IIC起始信號(hào):
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);
}
//產(chǎn)生IIC停止信號(hào)
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);
}
//產(chǎn)生ACK應(yīng)答
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;
}
//不產(chǎn)生ACK應(yīng)答
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設(shè)置為輸入
// 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發(fā)送一個(gè)字節(jié)
//返回從機(jī)有無應(yīng)答
//1,有應(yīng)答
//0,無應(yīng)答
void IIC_Send_Byte(uint8_t txd)
{
uint8_t i=0;
I2C_SDA_OUT();
I2C_SCL_L;//拉低時(shí)鐘開始數(shù)據(jù)傳輸
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); //發(fā)送數(shù)據(jù)
I2C_SCL_L;
//delay_us(I2C_DELAY_CLK);
}
// i2c_read_ack();
}
//讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送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;
}
復(fù)制代碼
#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 來實(shí)現(xiàn)I2C接口
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1