历史上的今天
今天是:2024年11月09日(星期六)
2019年11月09日 | stm8的I2C库的使用
2019-11-09 来源:eefocus
一.前言
stm8是一款低功耗的MCU芯片,它具备stm32库函数和资源丰富的优势。也同时具有价格便宜,低功耗的特点。在一些项目中,能起到很好的作用。下面我介绍一下stm8的IIC硬件库函数驱动代码及实现。
二.IIC基本操作
iic基本操作分为读操作和写操作,这两个操作就可以对设备进行一些基本的操作了。还要知道设备的地址就ok了,具体的IIC时序大家可以上网看看。
三.实现代码
1.先要启动IIC的时钟,保证可以正常工作。 CLK_PeripheralClockConfig (CLK_Peripheral_I2C1,ENABLE);//开启IIC1时钟
2.再对IIC进行初始化的操作
void Init(void)
{
I2C_DeInit();
I2C_Init(I2C_Speed, 0x88, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
I2C_Cmd(ENABLE);
}
可以用来对IIC的通信时间和主机地址以及从机地址等参数进行设置。IICSPEED最好不要超过400K,会造成通信的不稳定,最好在100K左右就可以了,host_address是主机的地址,可以自己设定。
3.IIC的写操作
/****************************************************************************
* 名称:I2C_WriteByte(uint8_t addr,uint8_t data)
* 功能:进行IIC的写操作。
* 入口参数: uint8_t addr 寄存器的地址
* uint8_t data 写入的数据
* 出口参数:无
* 说明:对触摸屏的寄存器进行写入操作,变量都是16进制
****************************************************************************/
void I2C_WriteByte(uint8_t addr,uint8_t data)
{
while(I2C_GetFlagStatus( I2C_FLAG_BUSBUSY));
I2C_GenerateSTART( ENABLE);//开启I2C1
while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
I2C_Send7bitAddress( I2C1_WRITE_ADDRESS7, I2C_DIRECTION_TX );//器件地址 -- 默认0xD0
while(!I2C_CheckEvent( I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData( addr);//寄存器地址
while (!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData( data);//发送数据
while (!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_AcknowledgeConfig(ENABLE);
I2C_GenerateSTOP( ENABLE);//关闭I2C1总线
}
上面的代码是IIC的写函数,可以对设备的寄存器进行写操作。I2C1_WRITE_ADDRESS7代表设备IIC的写入地址,根据器件地址的不同改变就可以。每一步都是调用的IIC的库函数,如果进行单步调试,地址寄存器都对的话,就可以看见每操作一步从机都会有一个应答信号。
4.IIC的读操作
uint8_t I2C_ReadByte(uint8_t addr)
{
uint8_t i;
while(I2C_GetFlagStatus( I2C_FLAG_BUSBUSY));
I2C_GenerateSTART( ENABLE);//开启I2C1
while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
I2C_Send7bitAddress( I2C1_WRITE_ADDRESS7, I2C_DIRECTION_TX );//器件地址 -- 默认0xD0
while(!I2C_CheckEvent( I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
I2C_SendData( addr);//寄存器地址
while (!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART( ENABLE);//开启I2C1
while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
I2C_Send7bitAddress( I2C1_READ_ADDRESS7, I2C_DIRECTION_RX );//器件地址 -- 默认0xD1
while(!I2C_CheckEvent( I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
i=I2C_ReceiveData();//读取数据
I2C_AcknowledgeConfig(DISABLE);
I2C_GenerateSTOP( ENABLE);//关闭I2C1总线
return i;
}
IIC的读操作,跟写操作不同的是.读操作首先要先进行写操作,写一下要读的寄存器地址,当然地址也要发送写入的地址。然后再写入器件读取地址,要读取的寄存器地址,把数据读取出来。I2C1_READ_ADDRESS7为器件的读取地址,写操作和读操作两个操作的应答变量也不一样,这个要注意一下。
四.总结
硬件IIC的库函数实现通信,代码实现量小,调通以后的稳定性高,速度快。缺点是可能会占一部分内存空间,调试不方便,因为都是用的库函数,不容易找问题。
上一篇:STM8S103之GPIO
下一篇:stm8s105调试I2C记录
史海拾趣
|
软件大小:99.14M 下载地址:http://www.realview.com.cn/down-list.asp?id=584 注意:MDK中国版例程服务包请前往http://www.realview.com.cn/down-list.asp?id=585下载 RealView MDK 3.24更新说明 ================== 1. ...… 查看全部问答> |
|
两块板子,一块单片机板子,一块ARM9板子。单片机板子上没有操作系统,ARM9板子上加载了Linux操作系统。 一方面,在ARM9板子上,需要把单片机板子通过无线传送过来的IPv6包解析,并最终把包中应用层的数据传给PC机服务器;另一方面,ARM9板子要接 ...… 查看全部问答> |
|
最近在做毕业设计,要求发射红外信号,得知红外信号是38K的载波PAM调制形成的,现在是用的定时器中断9us一次再在中断处理中实现PAM,但是在Protues里面显示的波形却是40us的。请问这是怎么回事?请问各位大牛有什么更好的办法实现上述要求。谢谢。… 查看全部问答> |
|
最近调试流接口驱动程序出了些问题,麻烦论坛里的牛牛们指教,问题描述如下: 三星2440平台,wince5.0,调试ADC的流接口驱动程序,我只为了测试所以很多功能都简化了,就是往寄存器里写一次,直接读回,用了virtualalloc和virtualcopy函数映射地址 ...… 查看全部问答> |
|
如题。。wince6下能不能用ACESS数据库? 做个CE5下用EVC写ACESS比较麻烦。。 CE6能不能直接用VS2005连ACESS?… 查看全部问答> |
|
编译出现以下的错误: BUILD: [00:0000000078:PROGC ] Building LINK Pass in D:\\WINCE600\\PLATFORM\\LPC32XX\\src\\drivers\\SERIAL\\ directory. BUILD: [01:0000000089:PROGC ] Linking D:\\WINCE600\\platform\\LPC32XX\\target\\ARMV4I\\d ...… 查看全部问答> |
|
书上说左边的电路Io=Vin/R2,我能理解到根据负反馈,运放工作于虚短的状态,R2上的电压为Vin,根据KCL定理,Vin/R2=Io+Ir1(FET 源漏极电流),书里没有说为什么可以忽略这个源漏极电流,想请教一下大家。 另外右边的电路,是引入了正反馈,不能用虚 ...… 查看全部问答> |




