刚开始学STM8,很多东西刚了解,正在做一个温湿度显示小板,就是使用I2C驱动SHT20传感器,并显示到数码管,数码管用的四位一体共阴数码管,STM8管脚有限,添加了一片TM1650做驱动,不过SHT20和TM1650都是用的I2C接口,由于对STM8硬件I2C还不了解,先打算用软件模拟,这就涉及到需要对GPIO做输入输出切换处理来检测ACK响应,刚开始,直接操作DDR寄存器,但是出现从输出切换到输入就会出现单片机死机,不解,查资料,得到一个解决办法,在输出状态时,可以不用切换到输入,我使用管脚D4,D5这两个管脚,这两个管脚比较特殊,就是真正开漏,在管脚描述为T,其它描述为HS(高吸收电流)。
解决办法,将IO设置为开漏输出,外部加上拉,做输入使用之前先输出高,再读取IO状态,即可,附上I2C代码:
#include "swiic.h"
void Delay_us(uint8_t i) //nus 粗略延时
{
for(; i>0; i--)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
/*================================================================
【 Name 】void I2CInit(void)
【Function】I2C初始化,空闲状态
【 Notes 】
【 Author 】Jack
【 Data 】2012.08.07
================================================================*/
void I2CInit(void)
{
SDA = 1;
Delay_us(5);
SCL = 1;
Delay_us(5);
}
void I2CStart(void) //开始信号
{
SCL = 1;
SDA = 1;
Delay_us(5);
SDA = 0;
Delay_us(5);
}
void I2CStop(void) //停止信号
{
Delay_us(5);
SCL = 1;
SDA = 0;
Delay_us(5);
SDA = 1;
}
uint8_t I2Cask(void) //ACK信号
{
uint8_t timeout = 1;
SCL = 1;
SDA = 1; //输入之前先输出高
Delay_us(5);
while((SDA_IN)&&(timeout<=100))
{
timeout++;
}
Delay_us(5);
SCL = 0;
Delay_us(5);
if(timeout >= 100)return NACK;
else return ACK;
}
void I2CWrByte(uint8_t Byte) //写一个字节高位在前,低位在后
{
uint8_t i;
SCL = 0;
Delay_us(1);
for(i=0;i<8;i++)
{
if(Byte&0x80)
{
SDA = 1;
}else
{
SDA = 0;
}
Byte <<= 1;
SCL = 0;
Delay_us(5);
SCL = 1;
Delay_us(5);
SCL = 0;
Delay_us(5);
}
Delay_us(5);
}
/*================================================================
【 Name 】uchar I2CRdByte(uchar AckValue)
【Function】I2C读一个字节数据,入口参数用于控制应答状态,ACK或者NACK
【 Notes 】从高到低,依次接收
【 Author 】dingshidong
【 Data 】2012.08.07
================================================================*/
uint8_t I2CRdByte(uint8_t AckValue)//receivebyte
{
uint8_t i,RDByte=0;
SCL = 0; //置时钟线为低,准备接收数据位--ZLG
SDA = 1; //输入之前先输出高
Delay_us(2);
for (i=0;i<8;i++)
{
SCL = 1; //SCL高电平期间,采集SDA信号,并作为有效数据 //置时钟线为高使数据线上数据有效--ZLG
Delay_us(2);
RDByte <<= 1; //移位
if(SDA_IN==1) //采样获取数据
{
RDByte |= 0x01;
}
else
{
RDByte &= 0xfe;
}
Delay_us(5);
SCL = 0; //下降沿,从机给出下一位值
Delay_us(5);
}
/*以下是I2C总线发送应答信号ACK或者NACK*/
if(1==AckValue) //应答状态
{
SDA = 1;
}
else
{
SDA = 0;
}
Delay_us(3);
SCL = 1;
Delay_us(5); //时钟低电平周期大于4μs--ZLG
SCL = 0; //清时钟线,钳住I2C总线以便继续接收--ZLG
Delay_us(15);
return RDByte;
}
上一篇:STM8 I2C从机
下一篇:STM8L驱动I2C类型的12864
推荐阅读
史海拾趣
在电子行业中,Helicomm公司凭借其深厚的技术积累和不断创新的精神,逐渐崭露头角并发展成为业界的佼佼者。以下是关于Helicomm公司发展起来的五个相关故事:
1. ZigBee技术的引领者
自2002年成立以来,Helicomm公司便致力于ZigBee及IEEE 802.15.4标准的研究与产品开发,成为全球ZigBee技术的引领者之一。公司不仅成功完成了IEEE 802.15.4和ZCP的双重资格认证,还推出了多款经过FCC认证的ZigBee模块,广泛应用于市政、安全、监测、物流、定位等领域。Helicomm的ZigBee模块为客户搭建了一条从芯片到应用的快速通道,极大地简化了无线产品的开发流程。(信息来源:百度百科)
2. 技术并购与子公司成立
2005年,Helicomm公司完成了对尉普(WirelessPlug)科技股份有限公司的并购,并成立了赫立讯科技(北京)有限公司,作为其在中国的全资子公司。这一举措不仅增强了Helicomm在全球无线通讯市场的竞争力,还为其在中国市场的拓展奠定了坚实的基础。赫立讯科技继承了尉普在无线传输终端产品方面的技术积累,进一步推动了ZigBee等无线通讯技术在中国的应用与发展。(信息来源:安阳市菲云网络科技有限公司网站)
3. 参与国际标准制定
作为ZigBee联盟的创始会员之一,Helicomm公司积极参与了ZigBee标准的制定与推广工作。通过与国际同行的紧密合作与交流,Helicomm不断提升自身在无线通讯领域的技术实力和影响力。其产品在符合国际标准的同时,也融入了公司的独特创新,满足了不同行业客户的多样化需求。(信息来源:综合多个来源)
4. 工业无线监控系统的创新
近年来,Helicomm公司联合柏元网控、研华科技等合作伙伴,共同推出了针对油田、水利等行业的工业无线监控系统方案。该系统方案充分利用了Helicomm在ZigBee、GSM/GPRS/CDMA等无线通讯技术方面的优势,结合合作伙伴在软件监控、硬件采集控制等方面的专长,为相关行业提供了高效、可靠的无线监控解决方案。这一创新不仅提升了行业的智能化水平,也进一步巩固了Helicomm在无线通讯领域的领先地位。(信息来源:重庆市智畅行物联科技有限公司网站)
5. 国际市场的拓展
Helicomm公司的产品不仅在中国市场取得了显著成绩,还成功打入国际市场,赢得了广泛的认可。公司凭借其先进的技术、稳定的产品性能和优质的本地化服务,在国际市场中建立了一席之地。特别是在水利、交通、环保、气象等领域,Helicomm的无线通讯产品得到了广泛应用,为全球客户提供了可靠的无线通讯解决方案。(信息来源:综合多个来源)
以上五个故事展示了Helicomm公司在电子行业中的发展历程和成就,体现了其在无线通讯领域的深厚技术实力和不断创新的精神。
为了扩大市场份额和提高品牌知名度,BENCENT公司开始积极参与国内外各类电子展会和论坛,与潜在客户和合作伙伴建立联系。同时,公司还加大了营销宣传力度,通过线上线下的方式提升品牌曝光度。这些努力不仅带来了更多的销售机会,也提升了公司在行业内的地位和影响力。
EMI公司深知产品质量对企业的重要性。因此,公司建立了严格的质量管理体系,从原材料采购到生产加工再到产品检验,每一个环节都严格把关。同时,公司还引进了先进的检测设备和技术手段,确保产品质量的稳定性和可靠性。这些措施的实施使得EMI公司的产品质量得到了客户的广泛认可。
近年来,FTDI通过并购等方式不断拓展其业务范围。例如,电连技术通过发行股份及支付现金的方式收购了FTDI的部分股权,使FTDI成为其控股子公司。这一并购不仅为电连技术带来了FTDI在USB桥接芯片领域的领先技术,还促进了双方在产品、客户和销售渠道等方面的协同效应。同时,FTDI也借此机会进一步提升了其在新兴市场如汽车电子、物联网等领域的竞争力。
在激烈的市场竞争中,品牌建设成为Amaze Electronics提升市场影响力的关键。公司注重品牌形象的塑造,通过举办各类活动、参与行业展会等方式,提高品牌知名度和美誉度。同时,公司还注重产品质量的把控,确保每一件产品都能体现公司的专业水准和品质追求。这些举措有效提升了Amaze Electronics在市场上的影响力,吸引了更多客户的关注和信赖。
为了进一步扩大市场份额,Emulation积极实施国际化战略。公司先后在北美、欧洲和亚洲等地设立了分支机构,与当地合作伙伴建立了紧密的合作关系。这些分支机构不仅为Emulation提供了更多的市场机会,还帮助公司更好地了解当地市场需求和竞争态势。
SoPC可编程片上系统是一种特殊的嵌入式微处理器系统。首先,它是片上系统(SOC),即由单个芯片完成整个系统的主要逻辑功能;其次,它是可编程系统,以FPGA为硬件基础,具有灵活的设计方式,可裁减、可 ...… 查看全部问答∨ |
用netstat -a —n命令查看!再state下面有一些英文,我来简单说一下这些英文具体都代表什么 LISTEN:侦听来自远方的TCP端口的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对 ...… 查看全部问答∨ |
养宠物当然是一件令人高兴的事情,但是要为它们打扫粪便就未必那么令人高兴了。很多小区也有这样的问题在。在欧美国家,人们通常采用的方式就是用手套着塑料袋将粪便捡起来,然后找到附近的垃圾箱扔进去。虽然隔着一层塑料袋,但是这种方式还是会令 ...… 查看全部问答∨ |
先谢谢你们帮忙我! 做个从外面进来一个RS232信号,分别转接4个RS422时,MAX232的TXIN和RXOUT直接可以接到四个MAX491的RO和DI脚吗? 好像是就接一个的话是不是直接可以这样接?用不用别的光电耦合器什么的?… 查看全部问答∨ |
机器上同时安装VS2005、VS2008,在安装Mobile5PPC SDK时,总是关联到VS2008。 怎样才能关联到VS2005… 查看全部问答∨ |
使用wince 6 打上r2及到2009。4月的所有补丁 硬件:S3C2443 以下是调试过程中的输出: SendCommand (0xd2998b60, 0x0005, 0x00000000, 0x0005, 0x0) starts CreaGetCommandResponse returned SD_API_STATUS_RESPONSE_TIMEOUT (COMM ...… 查看全部问答∨ |
我用430F149开发一个小语音芯片,用到了SPI串口,现在想用串口调试助手把整个系统测试下,结果发现UART0被SPI已经占用了,异步串口的3.4和3.5口始终输出高电平,板子做好了已经不好改了,不知道还有什么办法解决一下! 另:这个片子的串口UART和管 ...… 查看全部问答∨ |
设计的是三个层次的模块,顶层模块topcpu.v,中间模块cpu.v,底层模块adr.v我在topcpu.v中调用adr的端口信号pc_addr,仿真的时候出错:Unresolved reference to \'m_adr\' in t_cpu.m_adr.这是我的调用语句 while(test==1) &nbs ...… 查看全部问答∨ |