STM8S 模拟I2C程序
STM8S的硬件I2C还是存在问题,不敢贸然使用.
于是决定用模拟I2C.
#define SCL PE_ODR_ODR1
#define SDA PE_ODR_ODR2
#define SDAM PE_IDR_IDR2
#define SET_SCL_OUT() {PE_DDR_DDR1=1; PE_CR1_C11 = 1; PE_CR2_C21 = 0;}
#define SET_SDA_OUT() {PE_DDR_DDR2=1; PE_CR1_C12 = 1; PE_CR2_C22 = 0;}
#define SET_SDA_IN() {PE_DDR_DDR2=0; PE_CR1_C12 = 0; PE_CR2_C22 = 0;}
//--------------------------------------------------------------
// Prototype : void I2C_Start(void)
// Calls : Delay_5us()
// Description : Start Singnal
//--------------------------------------------------------------
void I2C_Init(void)
{
I2C_CR1 &= 0xFE; // PE=0, disable I2C module
SET_SCL_OUT();
SET_SDA_OUT();
}
//--------------------------------------------------------------
// Prototype : void Delay_5us(void)
// Description : 大约延时5us
//--------------------------------------------------------------
void Delay_5us(void)
{
uchar i; //fcpu 8MHz 时
; i>; i--);
}
//--------------------------------------------------------------
// Prototype : void I2C_Start(void)
// Calls : Delay_5us()
// Description : Start Singnal
//--------------------------------------------------------------
void I2C_Start(void)
{
// SDA 1->0 while SCL High
SDA = ;
SCL = ;
Delay_5us();
SDA = ;
Delay_5us();
SCL = ;
}
//--------------------------------------------------------------
// Prototype : void I2C_Stop(void)
// Calls : Delay_5us()
// Description : Stop Singnal
//--------------------------------------------------------------
void I2C_Stop(void)
{
// SDA 0->1 while SCL High
SDA = ;
SCL = ;
Delay_5us();
SDA = ;
Delay_5us();
}
//--------------------------------------------------------------
// Prototype : void I2C_SendACK(uchar ack);
// Calls : Delay_5us()
// Parameters : bit ack:1-noack, 0-ack
// Description : Master device send ACK to slave device.
//--------------------------------------------------------------
void I2C_SendACK(uchar ack)
{
)
{
SDA = ;
}
else
{
SDA = ;
}
SCL = ;
Delay_5us();
SCL = ;
Delay_5us();
}
//--------------------------------------------------------------
// Prototype : uchar I2C_SendByte(uchar sendDAT)
// Calls : Delay_5us()
// Parameters : uchar sendDAT---data to be send
// Return Value : CY--slave ack (1---noack,0---ack)
// Description : Send one byte to I2C
//--------------------------------------------------------------
uchar I2C_SendByte(uchar sendDAT)
{
uchar i,revack;
; i< ; i++)
{
SCL = ;
Delay_5us();
if (sendDAT & 0x80) // write data
{
SDA = ;
}
else
{
SDA = ;
}
sendDAT <<= ;
SCL = ;
Delay_5us();
}
SCL = ;
Delay_5us();
SET_SDA_IN();
SCL = ;
asm("nop");
asm("nop");
revack = (uchar)SDAM;
Delay_5us();
SCL = ;
SET_SDA_OUT();
Delay_5us();
return revack;
}
//--------------------------------------------------------------
// Prototype : uchar I2C_RecvByte()
// Calls : Delay_5us()
// Parameters : none
// Return Value : revDAT- received data
// Description : Receive one byte from I2C
//--------------------------------------------------------------
uchar I2C_RecvByte()
{
uchar i;
uchar revDAT = ;
SDA = ; // latch the Data port befor reading
SET_SDA_IN();
; i<; i++)
{
revDAT <<= ;
SCL = ;
asm("nop");
asm("nop");
if (SDAM)
{
revDAT |= 0x01;
}
else
{
revDAT &= 0xfe;
}
Delay_5us();
SCL = ;
Delay_5us();
}
SET_SDA_OUT();
return revDAT;
}
//--------------------------------------------------------------
// Prototype : void Write_PT2314(uchar wdata)
// Calls : I2C_Start(), I2C_Stop(),I2C_SendByte()
// Parameters : RegAddr-- target memory address,
// wrdata--- data to be writing
// Description : Write one byte to target memory
//--------------------------------------------------------------
void Write_24c02(uchar regadd,uchar wdata)
{
I2C_Start();
I2C_SendByte(0xA0); // Device Addr + Write (operation)
I2C_SendByte(regadd);
I2C_SendByte(wdata);
I2C_Stop();
}
uchar Read_24c02(uchar regadd)
{
uchar revdata;
I2C_Start();
I2C_SendByte(0xA0); // Device Addr + Write (operation)
I2C_SendByte(regadd);
I2C_Start();
I2C_SendByte(0xA1); // Device Addr + Write (operation)
revdata = I2C_RecvByte();
I2C_SendACK();
I2C_Stop();
return revdata;
}
STM8S 模拟I2C程序的更多相关文章
- gpio模拟i2c驱动
前段时间做项目,需要gpio模拟i2c通信,最后参考了一些资料,然后编写了一个程序.现在发出来,以免以后忘记,也为一些需要的朋友提供参考.不喜勿喷哈. /* 说明:该程序是基于atmel公司的sama ...
- MSP430的IO口模拟I2C总线对AT24C25进行读写程序
功能: 实现MSP430口线模拟I2C总线协议与24C04通信. ** 描述: 主系统工作时钟为12MHz,I2C工 ...
- S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动
目录:一. 说明 二. 驱动程序说明及问题 三. 案例一 四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...
- 模拟I2C从机
模拟I2C主机的比较多,但是从机相对主机而言要难很多,这个供大家借鉴. 这个从机程序支持主机对它的随机写和随机读,连续读和连续写没做,有兴趣的可以完善下,呵呵. //Microcontrol CODE ...
- STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数
1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...
- STM32F4XX中断方式通过IO模拟I2C总线Master模式
STM32的I2C硬核为了规避NXP的知识产权,使得I2C用起来经常出问题,因此ST公司推出了CPAL库,CPAL库在中断方式工作下仅支持无子地址 的器件,无法做到中断方式完成读写大部分I2C器件.同 ...
- STM32F10x_模拟I2C读写EEPROM
Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...
- C51单片机模拟I2C总线驱动程序设计
/********************************** I2C总线驱动 ******************************** 模块名:I2C总线驱动 型号:I2C 功能描述 ...
- STM32F10x_模拟I2C读写_硬件I2C读写
STM32F10x_模拟I2C读写EEPROM STM32F10x_硬件I2C读写EEPROM(标准外设库版本) STM32F10x_硬件I2C主从通信(轮询发送,中断接收)
随机推荐
- golang 学习笔记
golan 声明的变量必须要用到? 语法 a,b:=2323; b为 bool 类型 结构体的赋值 需要用到逗号分隔字段 并且最后一个字段后也必须加上逗号 这和 JavaScript 的对象不一样哦 ...
- 4 - SQL Server 2008 之 使用SQL语句删除表格
使用删除表格的SQL命令与删除数据的命令一样,只是删除的是表格这个对象, 语法如下:DROP TABLE 表名 一般在删除表格之前,需判断这个表格存不存在,存在则删除,不存在则不进行执行任何代码. 代 ...
- ASP.NET Boilerplate 工作单元
从上往下说起,框架使用castle拦截器,拦截实现了IApplication.IRepository接口的所有方法,和使用了UnitOfWork 特性的方法,代码如下 internal class U ...
- Java使用poi对Execl简单_写_操作
public class WriteExecl { @Test public void writeExeclTest() throws Exception{ OutputStream os = new ...
- object标签参考(转载)
<object> 元素可支持多种不同的媒介类型,比如: 图片 音频 视频 Other 对象 显示图片 你可以显示一幅图片: <object height="100%&quo ...
- 在oracle中怎么把一张表的数据插入到另一张表中
把table2表的数据插入到table1中 insert into table1 select * from table2
- JSP技术
1. JSP技术简介 JSP全称是Java Server Pages,它和servlet技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.是sun公司定义的一种规范,JSP实际上就是Se ...
- HTML页面中启用360浏览器极速模式
今天做页面突然遇到浏览器一直在兼容模式下运行,体验不好,通过查询文档,在<head>中加入<meta name="renderer" content=" ...
- Tomcat 8熵池阻塞变慢详解(转)
Tomcat 8熵池阻塞变慢详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Tomcat 8启动很慢,且日志上无任何错误,在日志中查看到如下信息: ...
- 仿小米网jQuery全屏滚动插件fullPage.js
演 示 下 载 简介 如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次.比如 iPhone 5C 的介绍页面,QQ浏 ...