stm8的I2C库的使用

一.前言

       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的库函数实现通信,代码实现量小,调通以后的稳定性高,速度快。缺点是可能会占一部分内存空间,调试不方便,因为都是用的库函数,不容易找问题。


转载备注:该篇根据个人使用过程,对代码进行了修正,在s007c8上面试验成功

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值