历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2018年12月29日 | STM32 模拟IIC主设备 非IIC静默模式

2018-12-29 来源:eefocus

//为啥用软件模拟IIC而不用硬件IIC? 除了ST的IIC模块本身问题,还因为硬件IIC移植不方便,在不同的MCU中无法通用。


/****************************Copyright(c)*********************************************                                    


**--------------文件信息--------------------------------------------------------------


** 文 件 名:


** 创 建 人: 温世坚(wenshijian4@163.com)


** 创建日期: 2015年9月18日


** 描    述:


**---------- 版本信息------------------------------------------------------------------


** 版    本: V2.92


** 说    明:


**-------------------------------------------------------------------------------------


**************************************************************************************/


#include"IIC_Recv.h"


/****************************************************************************************


** 函数名称: IIC_ReadSilent


** 功能描述: 读取IIC数据,并返回数据长度及数据内容


** 参    数: *IIC_Recv :用于接收IIC数据的数组


 


** 返 回 值: 接收到的数据长度(以字节为单位)      


** 日   期: 2015年4月17日


**---------------------------------------------------------------------------------------


** 修 改 人: 温世坚


** 日   期:


**--------------------------------------------------------------------------------------


****************************************************************************************/


 


unsigned char IICx_Lens;


unsigned char ibit,Sda;


unsigned intSCL_H_Len,SCL_L_Len;  


//简单延时函数1


void IIC_Delay(void)


{


    u8 time=40;//60;//减少延时时间,20160707,待测试,WEN


    while(time--);


}


//简单延时函数2


void IIC_DelayUS(u8 us)


{


    while(us--);


}


//IIC 起始逻辑


u8 IIC_Start(void)


{


    SCL_H;


    SDA_H;


    IIC_Delay();//IIC_DelayUS(20);


    if(!Read_SDA)


        return 0;


    SDA_L;


    IIC_Delay();


    if(Read_SDA)


        return 0;


    SCL_L;


    IIC_Delay();


    return 1;


}


 //IIC停止逻辑


void IIC_Stop(void)


{


    SCL_H;


    SDA_L;


    IIC_Delay();//IIC_DelayUS(20);


    SDA_H;


    IIC_Delay();//IIC_DelayUS(20);


}


/****************************************************************************************


** 函数名称: IIC_WriteByte


** 功能描述: 操作SDL,SDA,发送数据到IIC总线


** 参    数: *IIC_Recv :用于接收IIC数据的数组


** 返 回 值: 1:发送成功;0:发送失败    


** 日   期: 2016年07月06日


**---------------------------------------------------------------------------------------


** 修 改 人: WEN


** 日   期:


**--------------------------------------------------------------------------------------


****************************************************************************************/


u8 IIC_WriteByte(u8 byte)


{


    u8 i=8;


    u8 mask=0x80;


    while(i--)


    {


        SCL_L;


        IIC_DelayUS(10);//IIC_Delay();//此处调整延时,减小延时时间,20160706,WEN


        if(byte&mask)


            SDA_H;


        else


            SDA_L;


        mask>>=1;


        IIC_DelayUS(10);//IIC_Delay();//此处调整延时,减小延时时间,20160706,WEN


        SCL_H;


        IIC_DelayUS(20);//IIC_Delay();//此处调整延时,减小延时时间,20160706,WEN


    }


    SCL_L;


    SDA_H;


    IIC_DelayUS(20);//IIC_Delay();//此处调整延时,减小延时时间,20160706,WEN


    SCL_H;


    IIC_DelayUS(20);//IIC_Delay();//此处调整延时,减小延时时间,20160706,WEN


    if(Read_SDA)


    {


        SCL_L;


        return 0;


    }


    SCL_L;


    return 1;


}


 


u8 IIC_ReadByte_ACK(void)


{


    u8 i=8;


    u8 byte=0;


    SDA_H;


    while(i--)


    {


        byte<<=1;


        SCL_L;


        IIC_DelayUS(20);//IIC_Delay();//此处调整延时,减小延时时间,20160706,WEN


        SCL_H;


        IIC_DelayUS(20);//IIC_Delay();//此处调整延时,减小延时时间,20160706,WEN


        if(Read_SDA)


            byte|=0x01;


    }


    SCL_L;


    IIC_Delay();


    SDA_L;


    IIC_Delay();


    SCL_H;


    IIC_Delay();


    SCL_L;


    return byte;


}


 


u8 IIC_ReadByte_NACK(void)


{


    u8 i=8;


    u8 byte=0;


    SDA_H;


    while(i--)


    {


        byte<<=1;


        SCL_L;


        IIC_DelayUS(20);//IIC_Delay();//此处调整延时,减小延时时间,20160706,WEN


        SCL_H;


        IIC_DelayUS(20);//IIC_Delay();//此处调整延时,减小延时时间,20160706,WEN


        if(Read_SDA)


            byte|=0x01;


    }


    SCL_L;


    IIC_Delay();


    SDA_H;


    IIC_Delay();


    SCL_H;


    IIC_Delay();


    SCL_L;


    return byte;


}


/****************************************************************************************


** 函数名称: IIC_Write


** 功能描述: 往IIC指定地址写一个字节数据


** 参    数: u8 addr,u8 byte


** 返 回 值: 1:成功;0:失败    


** 日   期: 2016年07月06日


**---------------------------------------------------------------------------------------


** 修 改 人: WEN


** 日   期:


**--------------------------------------------------------------------------------------


****************************************************************************************/


u8 IIC_Write(u8 addr,u8 byte)


{


    if(!IIC_Start())return 0;


    if(!IIC_WriteByte(addr)){IIC_Stop();return 0;}


    if(!IIC_WriteByte(byte)){IIC_Stop();return 0;}


    return 1;


}


/****************************************************************************************


** 函数名称: IIC_WriteEnd


** 功能描述: 往IIC写固定数据,使IIC的INT线恢复高电平,即取消中断


** 参    数:


** 返 回 值: 1:发送成功;0:发送失败    


** 日   期: 2016年07月06日


**---------------------------------------------------------------------------------------


** 修 改 人: 温世坚


** 日   期:


**--------------------------------------------------------------------------------------


****************************************************************************************/


u8 IIC_WriteEnd()


{


    if(!IIC_Start())return 0;


    if(!IIC_WriteByte(0xB8)){IIC_Stop();return 0;}


    if(!IIC_WriteByte(0x3E)){IIC_Stop();return 0;}


    if(!IIC_WriteByte(0xFF)){IIC_Stop();return 0;}


    IIC_Stop();


    return 1;


}


/****************************************************************************************


** 函数名称: IIC_MasterRead


** 功能描述: 从特定地址读取固定长度的数据,然后通过指针返回数据


** 参    数: u8 *IIC_R :用于接收IIC数据的数组


** 返 回 值: 接收到的数据长度    


** 日   期: 2016年07月06日


**---------------------------------------------------------------------------------------


** 修 改 人: WEN


** 日   期:


**--------------------------------------------------------------------------------------


****************************************************************************************/


u8 IIC_MasterRead(u8*IIC_Recv)


{


    u8 j;


    if(!IIC_Start())return 0;


    if(!IIC_WriteByte(0xB8)){IIC_Stop();return 0;}


    if(!IIC_WriteByte(0x20)){IIC_Stop();return 0;}


    if(!IIC_Start()){IIC_Stop();return 0;}


    if(!IIC_WriteByte(0xB9)){IIC_Stop();return 0;}


    for(j=0;j<6;j++)//11


    {


        IIC_Recv[j]=IIC_ReadByte_ACK();


    }


    IIC_Recv[j]=IIC_ReadByte_NACK();


    IIC_Stop();


    return 12;


}

推荐阅读

史海拾趣

百佳(BAIJIA)公司的发展小趣事

百佳公司深知技术创新是企业发展的核心动力。因此,他们不断加大研发投入,引进先进技术和设备,推动产品的升级换代。通过不断创新,百佳公司成功开发出了一系列具有自主知识产权的电子产品,不仅提升了企业的核心竞争力,也为行业的发展做出了重要贡献。

Aces Electronics Co Ltd公司的发展小趣事

Aces Electronics Co., Ltd.自成立之初,就致力于电子技术的研发与创新。在公司发展早期,Aces面临技术壁垒和市场竞争的双重压力。然而,公司通过不断投入研发资源,终于在某一关键领域取得了重大技术突破,推出了一款具有颠覆性的电子产品。这款产品凭借其卓越的性能和创新的设计,迅速在市场上获得了广泛认可,为Aces打开了新的发展空间。

ALSC [Alliance Semiconductor Corporation]公司的发展小趣事

为了保持竞争优势,ALSC始终将技术创新作为核心驱动力。公司投入大量资源用于研发,不断推出具有创新性的半导体产品。其中,一款具有高性能和低延迟的芯片产品赢得了市场的广泛认可,为公司的快速发展奠定了坚实的基础。

Elpida Memory公司的发展小趣事

在成立初期,Elpida Memory凭借先进的技术和强大的研发实力,迅速在全球DRAM市场占据了一席之地。然而,随着市场竞争的加剧和技术的快速发展,Elpida Memory也面临着巨大的挑战。尤其是在2008年全球金融危机爆发后,DRAM市场需求大幅下降,产品价格暴跌,Elpida Memory的经营状况也陷入了困境。

Capital Advanced Technologies公司的发展小趣事

面对未来电子行业的发展趋势和市场变化,CAT制定了明确的发展战略和布局。公司将继续加大研发投入,推动技术创新和产业升级;同时,积极拓展新的应用领域和市场空间,寻求与更多合作伙伴的共赢发展。此外,CAT还将注重人才培养和团队建设,为公司的长远发展提供坚实的人才保障。

通过以上五个故事,我们可以看到Capital Advanced Technologies公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和战略布局等方面的不断努力,逐渐成为了电子行业的领军企业。

华宇创公司的发展小趣事

华宇创深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到生产过程再到成品检测,每一个环节都严格把控。同时,华宇创还积极参与各类国际认证和标准制定工作,不断提升产品的品质和性能。这些努力使华宇创的产品在市场上赢得了良好的口碑和信誉,品牌知名度也逐渐提升。

问答坊 | AI 解惑

电容漏泄的测量

电容器是几乎所有电气设备上都会用到的主要器件。漏阻是电容器被测试的众多电气特征中的一个。漏阻通常被称为“IR”(Insulation Resistance,绝缘电阻),以“兆欧-微法”表示。在其它情况下,漏泄可能被表示为特定电压(通常为工作电压)下的漏 ...…

查看全部问答>

请教代替3sk318的双栅管

本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 请教各位高手,什么型号的双栅管可以代替3SK318(能直接替换最好) 谢谢! …

查看全部问答>

电动车跷跷板【F题,二等奖】

本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 电动车跷跷板~~~~~~~~  …

查看全部问答>

2440 读 温度芯片,总是无法触发中断,请教有什么方法呀?

BSP包里通过应用层调用IIC文件夹不能正常工作,只好转入到bootloader层去做温度检测了,可是无论如何也不能触发中断,有经验的请指教,先谢谢了。…

查看全部问答>

谁有基于单片机数字电流表的设计报告?

只要电路原理图和c源程序。小弟在这拜谢了! 或者谁能帮我改下这电压表的程序成电流表的程序: #include    unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,             &nbs ...…

查看全部问答>

Pci 网卡驱动

现在要开始搞pci网卡驱动想从Realtek 8139这个入手, 个位有甚么好的建议 linux device driver有個pci_skel框架, 不知道怎麼楊. …

查看全部问答>

深入浅出玩转 FPGA 特权同学的 书

深入浅出玩转 FPGA  特权同学的 书   大家东清楚,不用我介绍了吧!…

查看全部问答>

【号外】STM32F101也有USB

刚做的东西给几个小MM去贴片,把101当103贴上去了,居然USB也可以联机。但操作偶尔有问题,手工复位一般可以解决掉。听小道消息说,101是阉割的103,就像奔腾的cache有瑕疵变成赛扬一样。…

查看全部问答>

分享-最好用的串口终端

Bray++同志写的,俺用了好多年。这是最新版。 Terminal.rar (278.15 KB) 下载次数:190 2010-10-13 20:16 …

查看全部问答>

请教,这个I/O子程序是什么意思?

使能I/O口子程序,在CCS帮助文件中看到对该子程序 GPIO_Handle GPIO_open(   int chaNum,   Uint32 flags ); 的解释是: chaNum        GPIO channel to open: lags     & ...…

查看全部问答>