你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
没有找到相关结果
admin
赞同来自:
tjx0512
赞同来自: admin 、yanandren 、v投笔从容v 、qhwsj 、爱哭的热带鱼
#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开漏输出吗
要回复问题请先登录或注册
6 个回复
admin
赞同来自:
tjx0512
赞同来自: admin 、yanandren 、v投笔从容v 、qhwsj 、爱哭的热带鱼
默认配置为开漏输出 ,外部上拉,是可以直接读端口的!
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开漏输出吗