历史上的今天
返回首页

历史上的今天

今天是:2025年05月20日(星期二)

正在发生

2018年05月20日 | STM8S 模拟I2C程序

2018-05-20 来源:eefocus

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;
}


推荐阅读

史海拾趣

Gigabit Logic Inc公司的发展小趣事
通过控制脉冲信号的频率或占空比,可以实现更精细的调速范围。
超霸(GP)公司的发展小趣事

2013年,绿索超容在南京江宁区智能电网产业园正式成立。公司自创立之初,就明确了“制造中国可靠性最高的超级电容”的目标,以及“引领超容行业,做绿色能源模范”的使命。这一清晰的发展定位,为绿索超容后续的技术创新和市场拓展奠定了坚实的基础。公司初期虽然面临资金和技术挑战,但通过不懈努力,逐步建立了自己的研发团队和生产体系。

高博(GBG)公司的发展小趣事

谷峰电子有限公司的故事始于1995年,当时公司在香港成立,标志着其半导体元器件研发与销售的起点。初期,面对激烈的市场竞争和技术挑战,谷峰团队凭借对半导体技术的深刻理解和对市场需求的敏锐洞察,逐步确立了以功率MOSFET为核心产品的战略方向。2000年,谷峰在深圳设立分公司,进一步扩大了其研发和销售网络,为公司的快速发展奠定了坚实基础。

Artesyn Embedded Technologies公司的发展小趣事

Artesyn Embedded Technologies自1981年成立以来,一直致力于电源产品的研发与创新。在20世纪90年代,公司推出了一款具有突破性的精密电源产品,该产品以其高效能、低能耗的特点迅速在市场中获得了认可。这一成功不仅使公司获得了更多的市场份额,也为后续产品的研发奠定了坚实的基础。

博众电气(BZCN)公司的发展小趣事

随着国内市场的日益饱和,博众电气开始将目光投向国际市场。公司制定了国际化发展战略,积极参与国际竞争与合作。通过在国外设立分支机构、参加国际展会等方式,博众电气成功打开了国际市场的大门。如今,公司的产品已经远销海外多个国家和地区,国际市场份额逐年攀升。

聚洵(Gainsil)公司的发展小趣事

随着国内市场的日益饱和,博众电气开始将目光投向国际市场。公司制定了国际化发展战略,积极参与国际竞争与合作。通过在国外设立分支机构、参加国际展会等方式,博众电气成功打开了国际市场的大门。如今,公司的产品已经远销海外多个国家和地区,国际市场份额逐年攀升。

问答坊 | AI 解惑

关于DDK开发中的Build SoftICE Symbols的问题,我编译的工程生成了.sys文件,但没有生成.nms等用于调试的文件,不知是否和下面的出错信息

以下是出错的内容,我不明白“Matching PDB file not found.”是什么意思,是不是说生成的.sys文件里面没有编译信息? --------------------Configuration: RepSample - Win32 Free-------------------- Compiling resources with DDK resource c ...…

查看全部问答>

图片显示问题

我现在图片可以显示了,是在Onpaint函数里显示的,直接画了窗体上的。如果我想显示比我大的图怎么办? 我希望通过滑动条来显示? MFC不熟,谢谢指导,我加了滑动条,但滑动没效果的…

查看全部问答>

关于ARM体系结构主存与辅存运行

对于ARM体系取指,是从程序存储器flash中直接取出去译码(像51那样),还是先把程序换入内存,指令从内存中读取? 金币不多,对不起!…

查看全部问答>

求助高手关于wince下对excel的操作

RT,目前要吧windows上的一个程序移植到wince上去,其他功能都实现了,唯独关于excel部分有些错误 windows上的方法是AfxOleInit()之后就用CWorksheet、CWorkBook.....这几个类操作,在windows上运行没有错误 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...…

查看全部问答>

LPC2366的几个问题

1. LPC2366的三个VDD(DCDC)(3V3)引脚是否一定要接3.3V电源?周立功的资料说这三个引脚不使用可以悬空。。。但是当这三个引脚悬空时整个单片机根本就没有工作,H-JTAG无法识别芯片,ISP也无法连接,说明这三个脚应该是给内部某些关键模块供电的 ...…

查看全部问答>

LTC1605

各位大哥:         谁有LTC1605应用代码,在线等待。TKS!…

查看全部问答>

LPC2214 擦除问题

请问在擦除前是不是要用串口线把板子和主机相连. 第一次做,有点不明白,请高手指点一下. 怎么确实板子和主机已经连接成功了,成功又该怎么做. 谢谢!!…

查看全部问答>

ARM的相关问题

我刚接触单片机,能不能请各位高手解释一下ARM和单片机的关系。…

查看全部问答>

ST-LINK2进行STM32FLASH调试偶尔不能进入调试(有图)

                                 我使用ST-link2进行FLASH调试,前一段时间偶尔出现不能进入调试界面,给板子断电,然后关闭IAR,重新打开IAR又可以 ...…

查看全部问答>