STM32F072的I2C的使用方法
按官方提供的stm32f0xx_i2c.c中的说明部分做完初始化...
============================================================================
##### How to use this driver #####
============================================================================
[..]
(#) Enable peripheral clock using RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2Cx, ENABLE)
function for I2C1 or I2C2.
(#) Enable SDA, SCL and SMBA (when used) GPIO clocks using
RCC_AHBPeriphClockCmd() function.
(#) Peripherals alternate function:
(++) Connect the pin to the desired peripherals' Alternate
Function (AF) using GPIO_PinAFConfig() function.
(++) Configure the desired pin in alternate function by:
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF
(++) Select the type, OpenDrain and speed via
GPIO_PuPd, GPIO_OType and GPIO_Speed members
(++) Call GPIO_Init() function.
(#) Program the Mode, Timing , Own address, Ack and Acknowledged Address
using the I2C_Init() function.
(#) Optionally you can enable/configure the following parameters without
re-initialization (i.e there is no need to call again I2C_Init() function):
(++) Enable the acknowledge feature using I2C_AcknowledgeConfig() function.
(++) Enable the dual addressing mode using I2C_DualAddressCmd() function.
(++) Enable the general call using the I2C_GeneralCallCmd() function.
(++) Enable the clock stretching using I2C_StretchClockCmd() function.
(++) Enable the PEC Calculation using I2C_CalculatePEC() function.
(++) For SMBus Mode:
(+++) Enable the SMBusAlert pin using I2C_SMBusAlertCmd() function.
(#) Enable the NVIC and the corresponding interrupt using the function
I2C_ITConfig() if you need to use interrupt mode.
(#) When using the DMA mode
(++) Configure the DMA using DMA_Init() function.
(++) Active the needed channel Request using I2C_DMACmd() function.
(#) Enable the I2C using the I2C_Cmd() function.
(#) Enable the DMA using the DMA_Cmd() function when using DMA mode in the
transfers.
[..]
(@) When using I2C in Fast Mode Plus, SCL and SDA pin 20mA current drive capability
must be enabled by setting the driving capability control bit in SYSCFG.
使用I2C_SendData发送数据,...,没反应?I2C_FLAG_TXE也一直不置位,说明并没有真正启动发送, Why?
仔细阅读I2C_CR2寄存器,发现有个NBYTES域,于是在发送数据之前把这个域填上,就能正常发送了。
例如需要发送01,02,03三个字节的数据,先初始化CR2,把NBYTES填3,然后启动START,往TXDR中依次写入01,02,03,发送成功!
接受也是同样的道理,NBYTES要填写需要接受的字节数。
评论