X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
GD32 MCU
[经验分享] 【GD32F350开发分享七】GPIO模拟I2C驱动
Justice_Gao
2018-10-9 19:58
楼主
我的作品没有用到I2C,有空的时候改了一下,仅供大家才考一下
#include "I2C.h"
#define SCL_HIGH gpio_bit_set(GPIOC, GPIO_PIN_10)
#define SCL_LOW gpio_bit_reset(GPIOC, GPIO_PIN_10)
#define RESET_HIGH gpio_bit_set(GPIOC, GPIO_PIN_11)
#define RESET_LOW gpio_bit_reset(GPIOC, GPIO_PIN_11)
#define POWERDOWN_HIGH gpio_bit_set(GPIOC, GPIO_PIN_12)
#define POWERDOWN_LOW gpio_bit_reset(GPIOC, GPIO_PIN_12)
#define SDA_HIGH gpio_bit_set(GPIOC, GPIO_PIN_13)
#define SDA_LOW gpio_bit_reset(GPIOC, GPIO_PIN_13)
#define SDA_READ gpio_input_bit_get(GPIOC, GPIO_PIN_13)
void I2C_delay(void)
{
uint32_t t=300*13.5;
while(t--);
}
void nops1ms(void) //1ms
{
uint32_t t=8000*13.5;
while(t--);
}
void delay_50ms(void) //50ms
{
uint t=50;
for(t=0;t<50;t++)
nops1ms();
}
void Delay(void)
{
nops1ms();
nops1ms();
}
int I2C_Start(void)
{
SDA_HIGH;
SCL_HIGH;//高电平有效
I2C_delay();//延时
if(!SDA_READ)
{
return DISABLE;//SDA总线忙,退出
}
SDA_LOW;
I2C_delay();
//查看此时SDA已经变为低电平
if(SDA_READ)
return DISABLE;//SDA总线忙,退出
}
SCL_LOW;
return ENABLE;
}
void I2C_Stop(void)
{
SCL_LOW;
//制造一个上升沿,上升沿是结束的标志
SDA_LOW;
SCL_HIGH;//高电平有效
I2C_delay();//延时
SDA_HIGH;
I2C_delay();
}
void I2C_Ack()
{
SCL_LOW;
SDA_LOW;//置低
I2C_delay(); //注意延时时间应该大于4微秒,其他位置也是如此
SCL_HIGH;
I2C_delay();
SCL_LOW;
}
void I2C_NoAck()
{
SCL_LOW;
I2C_delay();
SDA_HIGH;//置高
I2C_delay();
SCL_HIGH;
I2C_delay();
SCL_LOW;
}
uint8_t I2C_GetAck(void)
{
uint8_t time = 0;
SDA_HIGH;
I2C_delay();
SCL_HIGH;
I2C_delay();
while(SDA_READ)
{
time++;
if(time > 250)
{
SCL_LOW;
return DISABLE;
}
}
SCL_LOW;
return ENABLE;
}
//I2C写一个字节
void I2C_SendByte(uint8_t Data)
{
uint8_t cnt;
for(cnt=0; cnt<8; cnt++)
{
SCL_LOW; //SCL低(SCL低时,变化SDA)
I2C_delay();
if(Data & 0x80)
{
SDA_HIGH; //SDA高,从最低位开始写起
}
else
{
SDA_LOW; //SDA低
}
Data <<= 1;
SCL_HIGH; //SCL高(发送数据)
I2C_delay();
}
SCL_LOW; //SCL低(等待应答信号)
I2C_delay();
}
//I2C读取一个字节
uint8_t I2C_ReadByte(uint8_t ack)
{
uint8_t cnt;
uint8_t data;
for(cnt=0; cnt<8; cnt++)
{
SCL_LOW; //SCL低
I2C_delay();
SCL_HIGH; //SCL高(读取数据)
data <<= 1;
if(SDA_READ)
{
data |= 0x01; //SDA高(数据有效)
}
I2C_delay();
}
//发送应答信号,为低代表应答,高代表非应答
if(ack == 1)
{
I2C_NoAck();
}
else
{
I2C_Ack();
}
return data; //返回数据
}
本帖最后由 Justice_Gao 于 2018-10-9 20:07 编辑
点赞
回复评论 (3)
沙发
hujj
开始的宏定义值得借鉴,谢谢楼主!
点赞
2018-10-10 10:24
板凳
Justice_Gao
引用:
hujj 发表于 2018-10-10 10:24
开始的宏定义值得借鉴,谢谢楼主!
不客气
点赞
2018-10-10 12:28
4楼
leifengfirst
多谢分享!
点赞
2018-10-10 18:33
最新活动
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
随便看看
电赛你最希望出什么样的题?(那种你会别人不会的)
430循迹程序
电子设计必看书籍推荐---电子产品设计EMC风险评估
【lpc11u34 ADC读取的值总是0x3ff】
用了CCS编译环境,但现在MSP430的插件无法成功安装
分享一本卡尔曼滤波的经典好书
汇编ORG问题
用图片教你识别各种电子器件
RT-Thread设备框架学习之SPI设备
关于二期学生培训视频的放出(不断更新中)
贡献launchpad 内部测温通过串口传输给PC
ST7-DVP3多少钱?
华为PCB规范
电机科普系列丨了解电机控制算法
基于DSP的程控交流电源的研制
LM3S9B92板子少了个作键盘的程序和PC连接
初学者,被开发板的垃圾代码坑了一晚上
CPLD执行一条语句需要多少时间
请教如何在Win CE 下开发Driver【或寻北京兼职人员】
想用2262,2272做遥控小车,怎样才能使小车前进的同时转弯?
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复