STM32硬件IIC操作 (转)

转自:http://blog.csdn.net/dengrengong/article/details/39831577 

Stm32具有IIC接口,接口有以下主要特性

多主机功能:该模块既可做主设备也可做从设备

主设备功能

C地址检测

产生和检测7/10位地址和广播呼叫

支持不同的通讯速度

状态标志:

发送器/接收器模式标志

字节发送结束标志

总线忙标志

错误标志

2个中断向量

可选的拉长时钟功能

具单字节缓冲器的DMA

虽然很多人说STM的硬件IIC不好用,但是对于这么一个设备去探索一下还是很有必要的,指不定哪天就用上了呢,

IIC借口一共有九个寄存器,比较重要的几个寄存器分别如下

1.       CR1


由这几个位我们可以正常产生标准IICSTART条件STOP条件,ACKNOACK

CR2


控制IIC的通行频率

这两位检测IIC总线是否收到数据


 

1.       对于硬件IIC的初始化流程包括

1.       配置IO,配置为GPIO_Mode_AF_OD模式

2.       选择IIC模式

3.       选择是否使能自动应答以及设备地址长度

4.       设置IIC总线的传输速率

2.       硬件IIC的读写操作其实逻辑上和标准总线类似,也是发送地址等待ack发送数据等待ACK,但是因为有硬件的自动参与,所以我们不需要延时了

 

具体代码如下

 

[cpp] view plain copy
  1. void HmcIICInit(void)  
  2. {  
  3.     /*GPIO初始化*/  
  4.     GPIO_InitTypeDef GPIO_InitStructure;  
  5.     /* 配置硬件IIC需要的变量 */   
  6.     I2C_InitTypeDef I2C_InitStructure;   
  7.   
  8.     /* 使能与 I2C1 有关的时钟 */  
  9.     RCC_APB2PeriphClockCmd  (RCC_APB2Periph_GPIOB,ENABLE );   
  10.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);    
  11.   
  12.     /* PB6-I2C1_SCL、PB7-I2C1_SDA*/  
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;   
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  15.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;   
  16.     GPIO_Init(GPIOB, &GPIO_InitStructure);   
  17.   
  18.     /*IIC外设初始化*/  
  19.   
  20.     /* I2C 配置 */  
  21.     I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;     //配置为普通IIC模式  
  22.     //I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;   
  23.     //I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress;   
  24.     I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  //使能自动应答     
  25.     I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;   
  26.     I2C_InitStructure.I2C_ClockSpeed = 50000;   //5K的速度?  
  27.   
  28.   
  29.     /* I2C1 初始化 */  
  30.     I2C_Init(I2C1, &I2C_InitStructure);      
  31.   
  32.     /* 使能 I2C1 */  
  33.     I2C_Cmd  (I2C1,ENABLE);   
  34.     /*允许应答模式*/  
  35.     I2C_AcknowledgeConfig(I2C1, ENABLE);     
  36. }  
  37.   
  38. void HmcByteWrite(u8 addr,u8 dataValue)  
  39. {  
  40.     I2C_GenerateSTART(I2C1,ENABLE);  
  41.   
  42.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  43.   
  44.     I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);  
  45.   
  46.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));  
  47.   
  48.     I2C_SendData(I2C1,addr);  
  49.   
  50.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));  
  51.   
  52.     I2C_SendData(I2C1,dataValue);  
  53.   
  54.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));  
  55.   
  56.     I2C_GenerateSTOP(I2C1,ENABLE);  
  57.   
  58. }  
  59.   
  60. u8 HmcByteRead(u8 addr)  
  61. {  
  62.     u8 dataValue;  
  63.   
  64.     while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));  
  65.   
  66.     I2C_GenerateSTART(I2C1,ENABLE);//起始信号  
  67.   
  68.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  69.   
  70.     I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);//发送设备地址+写信号  
  71.   
  72.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//  
  73.   
  74.     I2C_Cmd(I2C1,ENABLE);  
  75.   
  76.     I2C_SendData(I2C1,addr);//发送存储单元地址,从0开始  
  77.   
  78.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));  
  79.   
  80.     I2C_GenerateSTART(I2C1,ENABLE);//起始信号  
  81.   
  82.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  83.   
  84.     I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Receiver);//发送设备地址+读信号  
  85.   
  86.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));  
  87.   
  88.     I2C_AcknowledgeConfig(I2C1,DISABLE);  
  89.   
  90.     I2C_GenerateSTOP(I2C1,ENABLE);  
  91.   
  92.     while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));  
  93.   
  94.     dataValue=I2C_ReceiveData(I2C1);//读出寄存器数据  
  95.   
  96.     return dataValue;  
  97. }  
展开阅读全文

没有更多推荐了,返回首页