GD32 模拟IIC程序驱动
2017-03-03 11:04
281 查看
通过GD32单片机两个普通IO口模拟IIC程序
作者:霍宏鹏
交流:1045338804@qq.com
剪>>>>>>>>>>>>>>>>>>=========================================================================================================
#ifndef __PLATFORM_IIC_H__
#define __PLATFORM_IIC_H__
#define IIC_ACK 0x00
#define IIC_NACK 0x01
void iic_init(void);
void iic_start(void);
void iic_stop(void);
unsigned char iic_read_byte(void);
void iic_write_byte(unsigned char data);
unsigned char iic_wait_ack(void);
void iic_ack(unsigned char ack_nack);
#endif
/*******************************************************************************
file : platform_iic.c
author : huohongpeng
date : 2017-02-23
description : application for IIC, base on gd lib (GPIO)
*******************************************************************************/
#include "platform_iic.h"
#include "platform_delay.h"
#include "gd32f1x0.h"
#define iic_printf printf("[%d-%s()] : ",__LINE__, __FUNCTION__);printf
/**
description : IIC delay us function interface
param : us - microsecond count
retval : None
author : huohongpeng
date : 2017-02-23
*/
static void iic_delay_us(int us)
{
delay_us(us);
}
/**
description : IIC SCL to high
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
static void iic_scl_h(void)
{
GPIO_SetBits(GPIOB, GPIO_PIN_13);
}
/**
description : IIC SCL to low
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
static void iic_scl_l(void)
{
GPIO_ResetBits(GPIOB, GPIO_PIN_13);
}
/**
description : IIC write one bit data to sda
param : bit - 0, 1
retval : None
author : huohongpeng
date : 2017-02-23
*/
static void iic_write_sda(unsigned char bit)
{
if(bit == 0)
{
GPIO_ResetBits(GPIOB, GPIO_PIN_15);
}
else
{
GPIO_SetBits(GPIOB, GPIO_PIN_15);
}
}
/**
description : IIC read one bit data to sda
param : None
retval : bit - 0, 1
author : huohongpeng
date : 2017-02-23
*/
static unsigned char iic_read_sda(void)
{
if(GPIO_ReadInputBit(GPIOB, GPIO_PIN_15) == Bit_SET)
{
return 0x01;
}
else
{
return 0x00;
}
}
/**
description : IIC SCL and SDA init
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_init(void)
{
GPIO_InitPara GPIO_InitParaStruct;
/* iic interface */
RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);
GPIO_InitParaStruct.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitParaStruct.GPIO_PuPd = GPIO_PUPD_PULLUP;
GPIO_InitParaStruct.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitParaStruct.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_13;
GPIO_Init(GPIOB, &GPIO_InitParaStruct);
GPIO_InitParaStruct.GPIO_OType = GPIO_OTYPE_OD;
GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_15;
GPIO_Init(GPIOB, &GPIO_InitParaStruct);
GPIO_SetBits(GPIOB, GPIO_PIN_13);
GPIO_SetBits(GPIOB, GPIO_PIN_15);
}
/**
description : IIC send start
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_start(void)
{
iic_write_sda(1);
iic_scl_h();
iic_delay_us(1);
iic_write_sda(0);
iic_delay_us(1);
iic_scl_l();
iic_delay_us(1);
}
/**
description : IIC send stop
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_stop(void)
{
iic_scl_l();
iic_delay_us(1);
iic_write_sda(0);
iic_scl_h();
iic_delay_us(1);
iic_write_sda(1);
iic_delay_us(1);
}
/**
description : IIC read one byte data
param : None
retval : one byte data
author : huohongpeng
date : 2017-02-23
*/
unsigned char iic_read_byte(void)
{
int i, data;
for(i = 0, data = 0; i < 8; i++)
{
data <<= 1;
iic_scl_h();
iic_delay_us(1);
data |= iic_read_sda();
iic_scl_l();
iic_delay_us(1);
}
return data;
}
/**
description : IIC write one byte data
param : one byte data
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_write_byte(unsigned char data)
{
int i;
for(i = 0; i < 8; i++)
{
iic_write_sda((data & 0x80)>>7);
iic_delay_us(1);
iic_scl_h();
iic_delay_us(1);
iic_scl_l();
iic_delay_us(1);
data <<= 1;
}
}
/**
description : IIC wait device ack
param : None
retval : 0 - success
1 - error
author : huohongpeng
date : 2017-02-23
*/
unsigned char iic_wait_ack(void)
{
iic_write_sda(0x01);
iic_delay_us(1);
iic_scl_h();
iic_delay_us(1);
if(iic_read_sda() == 0)
{
iic_scl_l();
iic_delay_us(1);
return 0;
}
else
{
iic_printf("stop \r\n");
iic_stop();
return 1;
}
}
/**
description : IIC send ack or nack to device
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_ack(unsigned char ack_nack)
{
iic_write_sda(ack_nack);
iic_delay_us(1);
iic_scl_h();
iic_delay_us(1);
iic_scl_l();
iic_delay_us(1);
}
作者:霍宏鹏
交流:1045338804@qq.com
剪>>>>>>>>>>>>>>>>>>=========================================================================================================
#ifndef __PLATFORM_IIC_H__
#define __PLATFORM_IIC_H__
#define IIC_ACK 0x00
#define IIC_NACK 0x01
void iic_init(void);
void iic_start(void);
void iic_stop(void);
unsigned char iic_read_byte(void);
void iic_write_byte(unsigned char data);
unsigned char iic_wait_ack(void);
void iic_ack(unsigned char ack_nack);
#endif
/*******************************************************************************
file : platform_iic.c
author : huohongpeng
date : 2017-02-23
description : application for IIC, base on gd lib (GPIO)
*******************************************************************************/
#include "platform_iic.h"
#include "platform_delay.h"
#include "gd32f1x0.h"
#define iic_printf printf("[%d-%s()] : ",__LINE__, __FUNCTION__);printf
/**
description : IIC delay us function interface
param : us - microsecond count
retval : None
author : huohongpeng
date : 2017-02-23
*/
static void iic_delay_us(int us)
{
delay_us(us);
}
/**
description : IIC SCL to high
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
static void iic_scl_h(void)
{
GPIO_SetBits(GPIOB, GPIO_PIN_13);
}
/**
description : IIC SCL to low
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
static void iic_scl_l(void)
{
GPIO_ResetBits(GPIOB, GPIO_PIN_13);
}
/**
description : IIC write one bit data to sda
param : bit - 0, 1
retval : None
author : huohongpeng
date : 2017-02-23
*/
static void iic_write_sda(unsigned char bit)
{
if(bit == 0)
{
GPIO_ResetBits(GPIOB, GPIO_PIN_15);
}
else
{
GPIO_SetBits(GPIOB, GPIO_PIN_15);
}
}
/**
description : IIC read one bit data to sda
param : None
retval : bit - 0, 1
author : huohongpeng
date : 2017-02-23
*/
static unsigned char iic_read_sda(void)
{
if(GPIO_ReadInputBit(GPIOB, GPIO_PIN_15) == Bit_SET)
{
return 0x01;
}
else
{
return 0x00;
}
}
/**
description : IIC SCL and SDA init
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_init(void)
{
GPIO_InitPara GPIO_InitParaStruct;
/* iic interface */
RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);
GPIO_InitParaStruct.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitParaStruct.GPIO_PuPd = GPIO_PUPD_PULLUP;
GPIO_InitParaStruct.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitParaStruct.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_13;
GPIO_Init(GPIOB, &GPIO_InitParaStruct);
GPIO_InitParaStruct.GPIO_OType = GPIO_OTYPE_OD;
GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_15;
GPIO_Init(GPIOB, &GPIO_InitParaStruct);
GPIO_SetBits(GPIOB, GPIO_PIN_13);
GPIO_SetBits(GPIOB, GPIO_PIN_15);
}
/**
description : IIC send start
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_start(void)
{
iic_write_sda(1);
iic_scl_h();
iic_delay_us(1);
iic_write_sda(0);
iic_delay_us(1);
iic_scl_l();
iic_delay_us(1);
}
/**
description : IIC send stop
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_stop(void)
{
iic_scl_l();
iic_delay_us(1);
iic_write_sda(0);
iic_scl_h();
iic_delay_us(1);
iic_write_sda(1);
iic_delay_us(1);
}
/**
description : IIC read one byte data
param : None
retval : one byte data
author : huohongpeng
date : 2017-02-23
*/
unsigned char iic_read_byte(void)
{
int i, data;
for(i = 0, data = 0; i < 8; i++)
{
data <<= 1;
iic_scl_h();
iic_delay_us(1);
data |= iic_read_sda();
iic_scl_l();
iic_delay_us(1);
}
return data;
}
/**
description : IIC write one byte data
param : one byte data
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_write_byte(unsigned char data)
{
int i;
for(i = 0; i < 8; i++)
{
iic_write_sda((data & 0x80)>>7);
iic_delay_us(1);
iic_scl_h();
iic_delay_us(1);
iic_scl_l();
iic_delay_us(1);
data <<= 1;
}
}
/**
description : IIC wait device ack
param : None
retval : 0 - success
1 - error
author : huohongpeng
date : 2017-02-23
*/
unsigned char iic_wait_ack(void)
{
iic_write_sda(0x01);
iic_delay_us(1);
iic_scl_h();
iic_delay_us(1);
if(iic_read_sda() == 0)
{
iic_scl_l();
iic_delay_us(1);
return 0;
}
else
{
iic_printf("stop \r\n");
iic_stop();
return 1;
}
}
/**
description : IIC send ack or nack to device
param : None
retval : None
author : huohongpeng
date : 2017-02-23
*/
void iic_ack(unsigned char ack_nack)
{
iic_write_sda(ack_nack);
iic_delay_us(1);
iic_scl_h();
iic_delay_us(1);
iic_scl_l();
iic_delay_us(1);
}
相关文章推荐
- 51单片机普通IO口模拟IIC总线的程序实现
- 中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
- 防止GPIO模拟IIC驱动被其他线程打断的方法
- 模拟iic和硬件iic驱动的区别
- iic驱动(IO口模拟)
- 51单片机普通IO口模拟IIC总线的程序实
- 关于温湿度SHT20传感器,用普通GPIO口来模拟IIC实现驱动
- 51单片机普通IO口模拟IIC总线的程序实现
- 高度提炼的模拟I2C_IIC程序
- 中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
- 模拟IIC总线汇编程序软件包
- Atmega的TWI通信,包含模拟IIC,硬件查询方式,以及硬件方式收发程序
- gpio软件模拟IIC与硬件IIC驱动有什么区别
- 00025-----GPIO模拟IIC总线程序
- 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
- 【转载】2440的GPIO模拟IIC程序
- 00025-----GPIO模拟IIC总线程序
- IIC 时序分析,stm32软件模拟驱动编写
- stm8 软件模拟IIC驱动PCF8563T,NOKIA5110液晶显示
- 一个模拟简单的物品掉落的程序