CUBE在用GPIO模拟I2C的时候 怎么给GPIO配置输入输出呀?

新手提问,勿喷 谢谢....
已邀请:

admin

赞同来自:

GPIO_Mode_Out_OD

#define SCL_SET() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET)
#define SCL_RESET() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_RESET)

#define SDA_SET() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET)
#define SDA_RESET() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET)
#define READ_SDA() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10)
//***************[i][b][/i][i][b][/i]以下是模拟I2C函数[/b][/b]************************//
/*================================================================
【名 称】void I2CDelay (unsigned char t)
【功 能】模拟IIC用的短延时
【备 注】
【作 者】
【时 间】
================================================================*/
void I2CDelay (unsigned char t)
{
while(t--);
}

/*================================================================
【名 称】void I2CInit(void)
【功 能】I2C初始化,空闲状态
【备 注】
【作 者】
【时 间】
================================================================*/
void I2CInit(void)
{
SDA_SET();
SCL_SET();
}


/*================================================================
【名 称】void I2CStart(void)
【功 能】I2C起始信号
【备 注】SCL、SDA同为高,SDA跳变成低之后,SCL跳变成低
【作 者】
【时 间】
================================================================*/
void I2CStart(void)
{
SDA_SET();
SCL_SET();
I2CDelay(10);
SDA_RESET();
I2CDelay(20);
SCL_RESET();
I2CDelay(20);
}

/*================================================================
【名 称】void I2CStop(void)
【功 能】I2C停止信号
【备 注】SCL、SDA同为低,SCL跳变成高之后,SDA跳变成高
【作 者】
【时 间】
================================================================*/
void I2CStop(void)
{
SDA_RESET();
SCL_RESET();
I2CDelay(10);
SCL_SET();
I2CDelay(10);
SDA_SET();
I2CDelay(10);
}



/*================================================================
【名 称】unsigned char I2CWRByte(unsigned char WRByte)
【功 能】I2C写一个字节数据,返回ACK或者NACK
【备 注】从高到低,依次发送
【作 者】
【时 间】
================================================================*/
unsigned char I2CWRByte(unsigned char WRByte)
{
unsigned char i;
SCL_RESET();
for(i=0;i<8;i++)
{
if(WRByte&0x80)
{
SDA_SET();
}
else
{
SDA_RESET();
}
I2CDelay(10);
SCL_SET(); //输出SDA稳定后,拉高SCL给出上升沿,从机检测到后进行数据采样
I2CDelay(50);
SCL_RESET();
I2CDelay(10);
WRByte <<= 1;
}
SDA_SET();
SCL_SET();
I2CDelay(20);
if(READ_SDA()==1) //SDA为高,收到NACK
{
SCL_RESET();
I2CDelay(50);
return NACK;
}
else //SDA为低,收到ACK
{
SCL_RESET();
I2CDelay(50);
return ACK;
}
}


/*================================================================
【名 称】unsigned char I2CRDByte(unsigned char AckValue)
【功 能】I2C读一个字节数据,入口参数用于控制应答状态,ACK或者NACK
【备 注】从高到低,依次接收
【作 者】
【时 间】
================================================================*/
unsigned char I2CRDByte(unsigned char AckValue)
{
unsigned char i,RDByte=0;
SCL_RESET();
SDA_SET(); //释放总线
for (i=0;i<8;i++)
{
RDByte <<= 1; //移位
SCL_SET(); //给出上升沿
I2CDelay(30); //延时等待信号稳定
if(READ_SDA()==1) //采样获取数据
{
RDByte |= 0x01;
}
else
{
RDByte &= 0xfe;
}
SCL_RESET(); //下降沿,从机给出下一位值
I2CDelay(10);
}
if(AckValue )//应答状态
{
SDA_SET();
}
else
{
SDA_RESET();
}

I2CDelay(10);
SCL_SET();
I2CDelay(50);
SCL_RESET();
SDA_SET();
I2CDelay(1);
return RDByte;
}

默认配置为开漏输出 ,外部上拉,是可以直接读端口的!

xiaohuihui - 90后IT

赞同来自:

亲,我好像见过你!

uuuuu52066 - 岳阳新闻网http://news.yueyang001.com/

赞同来自:

(1)GPIO_Mode_AIN模拟输入
(2)GPIO_Mode_IN_FLOATING浮空输入
(3)GPIO_Mode_IPD下拉输入
(4)GPIO_Mode_IPU上拉输入
(5)GPIO_Mode_Out_OD开漏输出
(6)GPIO_Mode_Out_PP推挽输出
(7)GPIO_Mode_AF_OD复用开漏输出
(8)GPIO_Mode_AF_PP复用推挽输出

我们平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,


大狗k - UESTC

赞同来自:

一般模拟IIC的时候是在要读的时候改GPIO的寄存器改为输入

要输出的时候改GPIO寄存器到输出

yyglucky - 70后IT大叔

赞同来自:

输入输出都设为(5)GPIO_Mode_Out_OD开漏输出吗

要回复问题请先登录注册