STM8S 模拟I2C程序

发布者:备战最新更新时间:2018-05-20 来源: eefocus关键字:STM8S  模拟I2C 手机看文章 扫描二维码
随时随地手机看文章

STM8S的硬件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 时
for (i=50; i>0; i--);
}

//--------------------------------------------------------------
// Prototype : void I2C_Start(void)
// Calls : Delay_5us()
// Description : Start Singnal
//--------------------------------------------------------------
void I2C_Start(void)
{
// SDA 1->0 while SCL High
SDA = 1; 
SCL = 1; 
Delay_5us(); 
SDA = 0; 
Delay_5us(); 
SCL = 0; 
}

//--------------------------------------------------------------
// Prototype : void I2C_Stop(void)
// Calls : Delay_5us()
// Description : Stop Singnal
//-------------------------------------------------------------- 
void I2C_Stop(void)
{
// SDA 0->1 while SCL High
SDA = 0; 
SCL = 1; 
Delay_5us(); 
SDA = 1; 
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)
{
if(ack == 0)
{
SDA = 0; 

else
{
SDA = 1; 
}

SCL = 1; 
Delay_5us(); 

SCL = 0; 
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;
for (i= 0 ; i< 8; i++) 
{
SCL = 0; 
Delay_5us(); 
if (sendDAT & 0x80) // write data
{
SDA = 1;
}
else 
{
SDA = 0;
}
sendDAT <<= 1;
SCL = 1; 
Delay_5us(); 


SCL = 0; 
Delay_5us(); 

SET_SDA_IN();

SCL = 1; 
asm("nop");
asm("nop");

revack = (uchar)SDAM;

Delay_5us(); 
SCL = 0; 

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 = 0;

SDA = 1; // latch the Data port befor reading

SET_SDA_IN();

for (i=0; i<8; i++) 

revDAT <<= 1;

SCL = 1; 

asm("nop");
asm("nop");

if (SDAM)
{
revDAT |= 0x01;
}
else
{
revDAT &= 0xfe;
}
Delay_5us(); 
SCL = 0; 
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(1);

I2C_Stop(); 

return revdata;
}


关键字:STM8S  模拟I2C 引用地址:STM8S 模拟I2C程序

上一篇:普通IO口模拟实现I2C通信及应用解析
下一篇:STM8单片机的中断优先级

推荐阅读最新更新时间:2024-03-16 16:03

STM8S电源管理-重点活跃停机模式
STM8 电源管理 2012-06-08 22:47:55| 分类: STM8 |字号 订阅 默认情况下在系统或电源复位后,MCU处于运行模式。在这种模式下,CPU由fCPU提供时钟并执行程序代码,系统时钟分别为各个处于激活状态的外设提供时钟,MCU功耗最大。 在运行模式下,为了保持CPU继续运行并执行代码,有下列几种途径可降低功率消耗: ● 降低系统时钟 ● 关闭未使用外设的时钟 ● 关闭所有未使用的模拟功能块 但是,如果CPU不需要保持运行,可使用下列三种低功耗模式: ● 等待(Wait) ● 活跃停机(Active Halt)( 可配置为慢速或快速唤醒) ● 停机(Halt) (可配置为慢速或快速唤醒)
[单片机]
<font color='red'>STM8S</font>电源管理-重点活跃停机模式
STM8S存储器的读写操作
/* ********************************************************************************************************************************** * Name : STM8S存储器的读写操作 * Author : MingMing * Release : 2014/1/2 * Update : 2014/1/2 * E-mail : clint.wang@foxmail.com ******************************************************************
[单片机]
C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)
/* 名称:C51IO口模拟I2C总线驱动EEPROM(AT24C16) 说明:I2C总线是由Philips公司开发的一种简单、半双工同步串行总线。它只需要两根线(SCL、SDA)即可在连接于总线上的器件之间传送信息。其中SCL时钟总线用于同步数据,SDA数据总线用来发送数据(或地址)。 和SPI总线不同的是,I2C总线通过在SDL上发送存储器的地址用来选中总线上对应的设备。关于具体的通信协议这里就不说了,无非是通过IO口模拟产生所需信号 (如通信开始信号是SCL为高时,SDA产生一个下降沿信号。) 驱动程序中有 具体的说明。 */ //定义I2C相关变量 sbit SCL=P2^1; //I2C 时钟
[单片机]
STM8S EEPROM 操作
STM8S 内置EEPROM,对于很大需要带记忆的产品来说,是个很好的资源,以下是我个人摸索出来的,并且验证OK,大家如需要可放心使用。 #define EEPROMADDR0X000 ((u32)(FLASH_DATA_START_PHYSICAL_ADDRESS)) #define EEPROMADDR0X001 ((u32)(FLASH_DATA_START_PHYSICAL_ADDRESS+1)) #define EEPROMADDR0X002 ((u32)(FLASH_DATA_START_PHYSICAL_ADDRESS+2)) #define EEPROMADDR0X003 ((u32)(FLASH_DAT
[单片机]
采用STM8S内部时钟产生PWM(TIM2)
  1 说明   采用STM8S内部时钟(HSI);   PWM模式2;   占空比为50%,频率为2Hz(方便测试LED灯);   PD2口外接LED灯,PD2口输出PWM波;   系统时钟初始化很重要:CLK_CKDIVR |= 0x08;   2 代码
[单片机]
采用<font color='red'>STM8S</font>内部时钟产生PWM(TIM2)
stm8s的UBC参数问题
咱们先介绍一下问题:我在做bootload时发现UBC选项字节和手册上的差别甚大,不知道是手册错误还是设置问题。 datasheet: UBC User boot code area 0x00: no UBC, no write-protection 0x01: Page 0 to 1 defined as UBC, memory write-protected 0x02: Page 0 to 3 defined as UBC, memory write-protected 0x03: Page 0 to 4 defined as UBC, memory write-protected ... 0x3E: Pages
[单片机]
<font color='red'>stm8s</font>的UBC参数问题
基于pic单片机的模拟I2C通信
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; File Name: i2c_low.asm ; Author: Alan G. Smith ; Purpose: This code is borrowed from M IC ro Chip with all of the fancy ; stuff taken out. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ InitI2CBusMaster
[单片机]
MSP430学习的第一个模拟I2C程序
#include msp430.h unsigned char I2CBUF; unsigned char checkbit; #define SCL_H (P10OUT |= BIT2) // P10.2为SCL #define SCL_L (P10OUT &= ~BIT2) #define SDA_H (P10OUT |= BIT1) //p10.1为SDA #define SDA_L (P10OUT &= ~BIT1) #define SDA_OUT (P10DIR |= BIT1) #define SDA_IN (P10DIR &= ~ BIT1) void I2C_Start(void) //I2C开
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved