stm32 之 IIC应用.docVIP

  • 4
  • 0
  • 约7.37千字
  • 约 7页
  • 2018-05-18 发布于河南
  • 举报
stm32 之 IIC应用

stm32 之 IIC应用 iic协议是比较简单的双线协议,时钟线CLK和数据线SDA。 一般我们常见的还有spi总线,这种总线可以可以根据需要扩展,还有单总线等等 这次还以at240c2为例进行操作! PS:这就是传说中的iic时序图 硬件构造我们不过多的分析,今天用到库了!我们先从库函数硬件iic初始化说起! PB6 ? -- ? CLK PB7 ? -- ? SDA [cpp] view plaincopyprint? void?i2c_init(u8?addr,u32?clock)?? {?? ????I2C_InitTypeDef?i2c;?? ????RCC-APB2ENR?|=?13;?? ????GPIOB-CRL?|=?(u32)0xff(6*4);?? ?????? ????RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);?? ????i2c.I2C_Ack?=?I2C_Ack_Enable;?? ????i2c.I2C_AcknowledgedAddress?=?I2C_AcknowledgedAddress_7bit;?? ????i2c.I2C_ClockSpeed?=?clock*1000;?? ????i2c.I2C_DutyCycle?=?I2C_DutyCycle_2;?? ????i2c.I2C_Mode?=?I2C_Mode_I2C;?? ????i2c.I2C_OwnAddress1?=?addr;?? ?? ????I2C_Cmd(I2C1,ENABLE);?? ????I2C_Init(I2C1,i2c);?? }?? void i2c_init(u8 addr,u32 clock) { I2C_InitTypeDef i2c; RCC-APB2ENR |= 13; GPIOB-CRL |= (u32)0xff(6*4); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); i2c.I2C_Ack = I2C_Ack_Enable; i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; i2c.I2C_ClockSpeed = clock*1000; i2c.I2C_DutyCycle = I2C_DutyCycle_2; i2c.I2C_Mode = I2C_Mode_I2C; i2c.I2C_OwnAddress1 = addr; I2C_Cmd(I2C1,ENABLE); I2C_Init(I2C1,i2c); } 在配置管脚方面,我还是喜欢用寄存器配置,因为我的两行代码可以解决库函数的N多行代码的问题! 还有在结构体变量命名方面也是属于我自己的独创吧,这样反正我觉得是既容易识别,也少打几个字! typedef struct { ? uint32_t I2C_ClockSpeed; //I2C时钟频率设置 ? uint16_t I2C_Mode; ? ? ? ? ? ? //I2C模式设置 ? uint16_t I2C_DutyCycle; ? ? //高低电平时间之比 ? uint16_t I2C_OwnAddress1; ? ? ?//主设备地址设置,也就是自己的地址 ? uint16_t I2C_Ack; ? ? ? ? ? ? ? ? //Check ? uint16_t I2C_AcknowledgedAddress; //地址长度,可以为7bit的也可以为10bit的 }I2C_InitTypeDef; IIC初始化完之后,我们开始来研究eeprom 看完这个写一个字节的协议之后,我们应该对这个写已经没有什么问题了,很简单的。 这个是写一个page 注:在eeprom里面写数据时,一次最多只能写一个page,一个page为8byte,同时这个也有字节对齐的要求! 比如我们从Address = 4开始写,那么我们最多一次性可写4个byte,如果我们从8开始写的话,我们就可以8个byte,最后偏移到15。 [cpp] view plaincopyprint? void?eeprom_write_byte(u8?wt_addr,u8?data)?? {?? ?? ????I2C_GenerateSTART(I2C1,ENABLE);delay(5);?? ????I2C_Send7bitAddress(I2C1,EEPROM_ADDR,I2C_Direction_Transmitter);?? ????while(!I2C_CheckEvent(I2C1,?I2C_EVE

文档评论(0)

1亿VIP精品文档

相关文档