标题:
STM8s 用GPIO模拟IIC通信源程序
[打印本页]
作者:
王杰
时间:
2019-7-29 09:08
标题:
STM8s 用GPIO模拟IIC通信源程序
实测有效,供大家一起学习
0.png
(5.03 KB, 下载次数: 50)
下载附件
2019-7-29 16:14 上传
单片机源程序如下:
/**
********************************** STM8S ***********************************
* @文件名 : soft_iic.c
* @作者 : gaoxiao
* @文件版本 : V1.0.0
* @日期 : 2019年06月29日
* @摘要 : 软件模拟IIC源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2019-06-29 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "soft_iic.h"
/************************************************
函数名称 : IIC_init
功 能 : iic初始化函数
参 数 : 无
返 回 值 : 无
作 者 : gaoxiao
*************************************************/
void IIC_init(void)
{
iic_scl_out();
iic_sda_out();
}
/************************************************
函数名称 : IIC_Start
功 能 : iic起始函数
参 数 : 无
返 回 值 : 无
作 者 : gaoxiao
*************************************************/
void IIC_Start(void)
{
iic_sda_out();
iic_sda_1();
iic_scl_1();
system_delay_100us(1);
iic_sda_0();
system_delay_100us(1);
iic_scl_0();
}
/************************************************
函数名称 : IIC_Stop
功 能 : iic结束函数
参 数 : 无
返 回 值 : 无
作 者 : gaoxiao
*************************************************/
void IIC_Stop(void)
{
iic_sda_out();
iic_sda_0();
iic_scl_0();
system_delay_100us(1);
iic_sda_1();
iic_scl_1();
system_delay_100us(1);
}
/************************************************
函数名称 : IIC_Wait_Ack
功 能 : 等待应答信号到来
参 数 : 无
返 回 值 : 1,接收应答失败 0,接收应答成功
作 者 : gaoxiao
*************************************************/
uint8_t IIC_Wait_Ack(void)
{
uint8_t ucErrTime = 0;
iic_sda_in();
system_delay_100us(1);
iic_scl_1();
system_delay_100us(1);
while(iic_sda_read())
{
ucErrTime++;
if(ucErrTime > 50)
{
IIC_Stop();
return 1;
}
system_delay_100us(1);
}
iic_scl_0();
return 0;
}
/************************************************
函数名称 : IIC_Ack
功 能 : 产生ACK应答信号
参 数 : cak 1:应答 2:无应答
返 回 值 : 无
作 者 : gaoxiao
*************************************************/
void IIC_Ack(uint8_t ack)
{
iic_scl_0();
iic_sda_out();
if(1 == ack) iic_sda_0();
else iic_sda_1();
system_delay_100us(1);
iic_scl_1();
system_delay_100us(1);
iic_scl_0();
}
/************************************************
函数名称 : IIC_SendByte
功 能 : 写一个字节,from MSB to LSB
参 数 : data 数据
返 回 值 : 无
作 者 : gaoxiao
*************************************************/
uint8_t IIC_WriteByte(uint8_t data)
{
uint8_t bits;
iic_sda_out();
for(uint8_t Loop_i = 0;Loop_i < 8;Loop_i ++)
{
bits = data&0x80;
if(0x80 == bits)
{
iic_sda_1();
}
else
{
iic_sda_0();
}
system_delay_100us(1);
iic_scl_1();
system_delay_100us(1);
iic_scl_0();
data = data << 1;
}
iic_sda_1();
return IIC_Wait_Ack();//等待应答
}
/************************************************
函数名称 : IIC_ReadByte
功 能 : 读一个字节
参 数 : 无
返 回 值 : 数据
作 者 : gaoxiao
*************************************************/
uint8_t IIC_ReadByte(void)
{
uint8_t data = 0;
iic_sda_1();
iic_sda_in();
system_delay_100us(1);
for(uint8_t Loop_i = 0;Loop_i < 8;Loop_i ++)
{
iic_scl_1();
system_delay_100us(1);
if(iic_sda_read())
{
data = (1 << 1)|data;
}
else
{
data = (0 << 1)|data;
}
system_delay_100us(1);
iic_scl_0();
system_delay_100us(1);
}
IIC_Ack(1);
return data;
}
复制代码
所有资料51hei提供下载:
soft_iic.7z
(1.36 KB, 下载次数: 52)
2019-7-29 09:07 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
果州物联
时间:
2019-8-29 15:37
谢谢LZ分享,学习了
作者:
wpppmlah
时间:
2019-8-30 16:23
感谢楼主的分享,学习受教了.
作者:
maoyongyi
时间:
2022-3-10 22:22
能用,不完整
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1