注册
登录
电子工程世界-论坛
返回首页
EEWORLD首页
频道
EE大学堂
下载中心
Datasheet
专题
单片机
物联网
汽车电子
嵌入式
手机/便携
模拟电子
家用电子
网络通信
电源管理
工业控制
测试测量
半导体设计/制造
安防电子
传感器
医疗电子
Justice_Gao的个人空间
https://home.eeworld.com.cn/space-uid-784175.html
[收藏]
[复制]
[分享]
[RSS]
空间首页
动态
记录
日志
相册
主题
分享
留言板
个人资料
借用开发板
论坛
淘帖
Collection
查看新帖
最新回复
社区活动
联系管理员
我的空间
帖子
日志
收藏
好友
勋章
积分
安全验证
请完成以下验证码
日志
【GD32F350开发分享七】GPIO模拟I2C驱动
已有 2305 次阅读
2018-10-9 19:58
|
个人分类:
GD32系列学习
我的作品没有用到I2C,有空的时候改了一下,仅供大家才考一下
#include "I2C.h"
#define SDA_HIGH gpio_bit_set(GPIOC, GPIO_PIN_13)
#define SDA_LOW gpio_bit_reset(GPIOC, GPIO_PIN_13)
#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)
//在开漏输出模式下,对端口输入状态寄存器的读访问将返回I/O的状态,因此 不需要为了读取数据,专门将I/0由输出设为输入
#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 init_camera(void)
{
uint i;
RESET_LOW;
POWERDOWN_HIGH;
for(i=0;i<10;i++)
nops1ms();
POWERDOWN_LOW;
for(i=0;i<10;i++)
nops1ms();
RESET_HIGH;
}
void I2C_Initializes(void)
{
I2C_GPIO_Configuration();
init_camera();
delay_50ms();
SCL_HIGH;
SDA_HIGH;
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; //返回数据
}
复制代码
本文来自论坛,点击查看完整帖子内容。
收藏
邀请
举报
全部
作者的其他最新日志
•
【GD32F350开发分享九】单端输入ADC+定时器单次转换
•
【GD32F350开发分享八】RTC年月日时分秒实时时钟,并显示在TFT屏幕上
•
【GD32F350开发分享六】USART0和USART1的双串口应用
•
【GD32F350开发分享五】GPIO模拟SPI控制液晶显示屏
•
【GD32F350开发分享四】定时器T0中断:外部高速时钟源8MHz
评论 (
0
个评论)
涂鸦板
您需要登录后才可以评论
登录
|
注册
评论
Justice_Gao
加为好友
给我留言
打个招呼
发送消息
热门文章
头条资讯
盖茨再捐200亿美元,谷歌云转投ARM,推特员工因马斯克遭CEO警告,今日更多大新闻在此
Meta元宇宙阿凡达项目曝光!小扎光剑变身,3秒装满512GB硬盘
从Si到SiC:如何迈好功率电子技术升级的这一步?
“无人问津”的Imagination终现买主,竟又是Canyon Bridge!仅电视芯片就出货1000万颗,厉害了 ,我的海思
医疗应用中至关重要的气泡探测器,选Ta就对了!
MDO4000C实测视频 | 自动峰值标记,简单方便高效!
新增数据手册
4608H-702-182/121L
531EC1393M00DG
94W-ER48H-CR0
1812AC152KAX9A
RN73H2ATTD8660D50
CHP2208K7320FNPC
热搜器件
RN73H2BTTD7150B25
ATMEGA8515L-8AJ
PEEL18CV8J-15
TPS24701EVM-002
TC74VHC273FW(ELP)
HSEC8-120-01-S-DV-A
推荐下载
(笔记)QuartusII9.1完全操作教程
长城1770显示器电路图
Linux的蓝牙操作工具。配合bluez-lib使用
单片机原理接口及应用与嵌入 628页 14M ppt.rar
单片机应用系统硬件抗干扰技术探讨
1225NV96
推荐关注
OpenCV 拆分、合并图像通道方法及复现
ICman液位检测芯片在温奶器中的应用
二叉树
Sub-GHz射频技术,缔造万物互联的“通信基石”
百望股份(06657.HK)引入DeepSeek大模型 打造企业級智能服務新生態
百望股份全面接入DeepSeek,打造企业级AGI革新引擎