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主从通信(轮询发送,中断接收)
随机推荐
- [React] Linting React JSX with ESLint (in ES6)
ESLint is a JavaScript linter (static analysis tool) that offers full support for ES6, JSX, and othe ...
- 23web app实现上下左右滑动
转载请说明出处:http://blog.csdn.net/wowkk/article/category/1619287 (创意系列) /*最近项目须要苹果电脑,假设您支持学生创业并愿意赞助我们一台,请 ...
- mysql 异常处理实例
1. 语法: DECLARE handler_action HANDLER FOR condition_value [, condition_value] ... statement handler_ ...
- block没那么难(一):block的实现
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...
- Raphaël.js学习笔记
Rapheal.js 是一个矢量图绘图库.对于支持HTML5 SVG的浏览器使用SVG绘图,不支持SVG的IE(ie6,7,8)使用VML绘图.所以Raphael.js的兼容性非常好. Raphael ...
- HttpContext.Current
HttpContext. Response 直接这样写会报错 是因为 httpcontext没有提供response 这个静态的方法. 通过这样写就可以 ASP.NET还为它提供了一个静态属性Http ...
- 分享一下自己在用的CSS样式重置代码
通过借鉴网上大牛们的经验和自己在工作中碰到的一些问题,总结出了这些比较常用的CSS样式重置的代码: @charset "utf-8"; /* 防止用户自定义背景颜色对网页的影响,添 ...
- Adb工具常用操作(一)
一.启动或关闭server 1.3 Android SDK中的常用命令行工具 在<Android SDK安装目录>\tools目录中带了很多命令行工具.虽然一般的开发人员并不需要完全掌握 ...
- CI 笔记5 (CI3.0 默认控制器,多目录)
在ci3.x中,不支持多级子目录的默认控制器设置, 解决方法如下: 在index.php中,添加 $routing['directory'] = 'admin';然后在默认的router.php的默 ...
- 【转】jquery两稳定版本比较~~
博客分类: Web前端 jquery jquery历经了多个版本的更新,版本上的比较貌似没什么必要性,一般来说新的版本会比旧的版本各方面都略有提升,但由于新版中增加了各种新的功能,难免会引起bug的 ...