IIC简单操作

简单介绍IIC

I2C 总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,两条线可以挂多个设备。 IIC设备(绝大多数)里有个固化的地址,只有在两条线上传输的值等于IIC设备的固化地址时,其才会作出响应。通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。

时序图

IIC简单操作_第1张图片

  1. 初始化:IIC的初始化为SDA和SCL均为高。
  2. 开始信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由高变低就表示一个开始信号。同时IIC总线上的设备检测到这个开始信号它就知道处理器要发送数据了。
  3. 停止信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由低变高就表示一个停止信号。同时IIC总线上的设备检测到这个停止信号它就知道处理器已经结束了数据传输,我们就可以各忙各个的了,如休眠等。

测试设备

主控制芯片RTL8762(iic主设备)
按键触摸芯片BS8116A-3(iic从设备)

FreeROTS

在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。

简介

FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为10.1.0版。

IIC相关

IIC简单操作_第2张图片
IIC简单操作_第3张图片
IIC简单操作_第4张图片
IIC简单操作_第5张图片
IIC简单操作_第6张图片

实现api

IIC简单操作_第7张图片
IIC简单操作_第8张图片

GPIO初始化

void PINMUX_button_Configuration(void)
{
    Pinmux_Config(I2C0_SCL, I2C0_CLK);
    Pinmux_Config(I2C0_SDA, I2C0_DAT);
    return;
}
void PAD_button_Configuration(bool EnterDlps)
{
		Pad_Config(I2C0_SCL, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
		Pad_Config(I2C0_SDA, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
		return;
}
void RCC_button_Configuration(void)
{
    /* Enable I2C clock */
    RCC_PeriphClockCmd(APBPeriph_I2C0, APBPeriph_I2C0_CLOCK, ENABLE);
    return;
}

iic初始化

iIC实现所需最基本的设置项:速率、运行模式、外设地址模式、外设地址、使能或者失能应答信号

 void I2C_Configuration(void)
{
    /* Initialize I2C */
    I2C_InitTypeDef  I2C_InitStructure;
    I2C_StructInit(&I2C_InitStructure);
    I2C_InitStructure.I2C_ClockSpeed = 100000;
    I2C_InitStructure.I2C_DeviveMode = I2C_DeviveMode_Master;
    I2C_InitStructure.I2C_AddressMode = I2C_AddressMode_7BIT;
    I2C_InitStructure.I2C_SlaveAddress = 0x50;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_Init(I2C0, &I2C_InitStructure);
    I2C_Cmd(I2C0, ENABLE);
}

写入iic数据

/*	设置按键模块灵敏度
参数:6~63
注:掉电会丢失数据*/
void Button_Set_config(uint8_t config)
{
		uint8_t num = 0;
		uint8_t I2C_ReadBuf[23] = {0};
		uint8_t I2C_WriteBuf[23] = {0xB0,0x00,0x00,0x83,0xf3,0xD8,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x49};
		if(config<0x06 || config>0x3f)
				return;
		for(;num<15;num++)
		{
				I2C_WriteBuf[num+6] = config;
		}
		I2C_WriteBuf[num+6] = config+0x40;
		I2C_RepeatRead(I2C0, I2C_WriteBuf, 22, I2C_ReadBuf, 1);
}

读取iic数据

/*	获取按键模块键值	*/
void Button_Get_data(void)
{
	uint8_t I2C_WriteBuf[16] = {0x08};
    uint8_t I2C_ReadBuf[16] = {0};
		
	I2C_RepeatRead(I2C0, I2C_WriteBuf, 1, I2C_ReadBuf, 2);
	button_data_processing(I2C_ReadBuf[0]+((uint16_t)(I2C_ReadBuf[1])<<8));
}

总结

本次实验只是简单的记录了iic完成基本通讯问题,由于本次采用的是freertos操作系统和硬件iic,所以涉及到的iic通讯时序还是很少的,本篇文章只是简单的实现了iic通讯,并没有对其进行深入研究,对于忘记通讯方式的情况可以快速上手。
iic作为总线的一种,最大的特点就是可以同时串入很多不同地址的IIC设备,分别根据地址来区别操作,本次实验没有用到多个iic设备,不过软件上操作起来也是差不多的,区别就在于每次通讯前都需要更改地址,单一设备就不需要。

你可能感兴趣的:(通讯)