STM32F10xIIC.docx
- 文档编号:24350133
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:75
- 大小:38.54KB
STM32F10xIIC.docx
《STM32F10xIIC.docx》由会员分享,可在线阅读,更多相关《STM32F10xIIC.docx(75页珍藏版)》请在冰豆网上搜索。
STM32F10xIIC
11.1I2C寄存器结构.....................................................................134
11.2I2C库函数.....................................................................135
No
函数名
描述
1
I2C_DeInit
将外设I2Cx寄存器重设为缺省值
2
I2C_Init
根据I2C_InitStruct中指定的参数初始化外设I2Cx寄存器
3
I2C_StructInit
把I2C_InitStruct中的每一个参数按缺省值填入
4
I2C_Cmd
使能或失能I2C外设
5
I2C_DMACmd
使能或失能指定I2C的DMA请求
6
I2C_DMALastTransferCmd
使下一次DMA传输为最后一次传输
7
I2C_GenerateSTART
产生I2Cx传输START条件
8
I2C_GenerateSTOP
产生I2Cx传输STOP条件
9
I2C_AcknowledgeConfig
使能或失能指定I2C的应答功能
10
I2C_OwnAddress2Config
设置指定I2C的自身地址2
11
I2C_DualAddressCmd
使能或失能指定I2C的双地址模式
12
I2C_GeneralCallCmd
使能或失能指定I2C的广播呼叫功能
13
I2C_ITConfig
使能或失能指定的I2C中断
14
I2C_SendData
通过外设I2Cx发送一个数据
15
I2C_ReceiveData
返回通过I2Cx最近接收的数据
16
I2C_Send7bitAddress
向指定的从I2C设备传送地址字
17
I2C_ReadRegister
读取指定的I2C寄存器并返回其值
18
I2C_SoftwareResetCmd
使能或失能指定I2C的软件复位
19
I2C_SMBusAlertConfig
驱动指定I2Cx的SMBusAlert管脚电平为高或低
20
I2C_TransmitPEC
使能或失能指定I2C的PEC传输
21
I2C_PECPositionConfig
选择指定I2C的PEC位置
22
I2C_CalculatePEC
使能或失能指定I2C的传输字PEC值计算
23
I2C_GetPEC
返回指定I2C的PEC值
24
I2C_ARPCmd
使能或失能指定I2C的ARP
25
I2C_StretchClockCmd
使能或失能指定I2C的时钟延展
26
I2C_FastModeDutyCycleConfig
选择指定I2C的快速模式占空比
27
I2C_GetLastEvent
返回最近一次I2C事件
28
I2C_CheckEvent【★】
检查最近一次I2C事件是否是输入的事件
29
I2C_GetFlagStatus
检查指定的I2C标志位设置与否
30
I2C_ClearFlag
清除I2Cx的待处理标志位
31
I2C_GetITStatus
检查指定的I2C中断发生与否
32
I2C_ClearITPendingBit
清除I2Cx的中断待处理位
11内部集成电路(I2C)
I2C总线接口连接微控制器和串行I2C总线。
它提供多主机功能,控制所有I2C总线特定的时序、协议、仲裁和定时。
支持标准和快速两种模式,同时与SMBus2.0兼容。
I2C总线有多种用途,包括CRC码的生成和校验、SMBus(系统管理总线SystemManagementBus)、PMBus(电源管理总线PowerManagementBus)。
I2C驱动可以用来通过I2C界面发送和接收数据,还可以返回传输操作的状态。
Section11.1I2C寄存器结构描述了固件函数库所使用的数据结构,Section11.2固件库函数介绍了函数库里的所有函数。
11.1I2C寄存器结构
I2C寄存器结构,I2C_TypeDeff,在文件中定义如下:
typedefstruct
{
vu16CR1;
u16RESERVED0;
vu16CR2;
u16RESERVED1;
vu16OAR1;
u16RESERVED2;
vu16OAR2;
u16RESERVED3;
vu16DR;
u16RESERVED4;
vu16SR1;
u16RESERVED5;
vu16SR2;
u16RESERVED6;
vu16CCR;
u16RESERVED7;
vu16TRISE;
u16RESERVED8;
}I2C_TypeDef;
Table204.例举了I2C所有寄存器
Table204.I2C寄存器
寄存器
描述
CR1
I2C控制寄存器1
CR2
I2C控制寄存器2
OAR1
I2C自身地址寄存器1
OAR2
I2C自身地址寄存器2
DR
I2C数据寄存器
SR1
I2C状态寄存器1
SR2
I2C状态寄存器2
CCR
I2C时钟控制寄存器
TRISE
I2C上升时间寄存器
2个I2C外设声明于文件“sm32f10x_map.h:
...
#definePERIPH_BASE((u32)0x40000000)
#defineAPB1PERIPH_BASEPERIPH_BASE
#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)
#defineAHBPERIPH_BASE(PERIPH_BASE+0x20000)
....
#defineI2C1_BASE(APB1PERIPH_BASE+0x5400)#defineI2C2_BASE(APB1PERIPH_BASE+0x5800)
....
#ifndefDEBUG
...
#ifdef_I2C1
#defineI2C1((I2C_TypeDef*)I2C1_BASE)
#endif/*_I2C1*/
#ifdef_I2C2
#defineI2C2((I2C_TypeDef*)I2C2_BASE)
#endif/*_I2C2*/
...
#else/*DEBUG*/
...
#ifdef_I2C1
EXTI2C_TypeDef*I2C1;
#endif/*_I2C1*/
#ifdef_I2C2
EXTI2C_TypeDef*I2C2;
#endif/*_I2C2*/
...
#endif
使用Debug模式时,初始化指针I2C1,I2C2于文件:
...
#ifdef_I2C1
I2C1=(I2C_TypeDef*)I2C1_BASE;
#endif/*_I2C1*/
#ifdef_I2C2
I2C2=(I2C_TypeDef*)I2C2_BASE;
#endif/*_I2C2*/
...
为了访问I2C寄存器,_I2C,_I2C1,_I2C2必须在文件“stm2f10x_conf.h中定义如下:
...
#define_I2C
#define_I2C1
#define_I2C2
...
11.2I2C库函数
I2C库函数【见首页】
11.2.1函数I2C_DeInit
Table206.函数I2C_DeInit
函数名
I2C_DeInit
函数原形
voidI2C_DeInit(I2C_TypeDef*I2Cx)
功能描述
将外设I2Cx寄存器重设为缺省值
输入参数
I2Cx:
x可以是1或2来选择I2C外设
输出参数
无
返回值
无
先决条件
无
被调用函数
RCC_APB1PeriphClockCmd().
例:
/*DeinitializeI2C2interface*/
I2C_DeInit(I2C2);
函数原型如下:
voidI2C_DeInit(I2C_TypeDef*I2Cx)
{
/*Checktheparameters*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
//#defineI2C1_BASE(APB1PERIPH_BASE+0x5400)
//#defineI2C2_BASE(APB1PERIPH_BASE+0x5800)
//#defineAPB1PERIPH_BASEPERIPH_BASE
//#definePERIPH_BASE((u32)0x40000000)
switch(*(u32*)&I2Cx)
{
caseI2C1_BASE:
//((u32)0x00200000)
/*EnableI2C1resetstate*/
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,ENABLE);//开启I2C1
/*ReleaseI2C1fromresetstate*/
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,DISABLE);
break;
caseI2C2_BASE:
//((u32)0x00400000)
/*EnableI2C2resetstate*/
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2,ENABLE);//开启I2C2
/*ReleaseI2C2fromresetstate*/
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2,DISABLE);
break;
default:
break;
}
}
11.2.2函数I2C_Init
Table207.函数I2C_Init
函数名
I2C_Init
函数原形
voidI2C_Init(I2C_TypeDef*I2Cx,I2C_InitTypeDef*I2C_InitStruct)
功能描述
根据I2C_InitStruct中指定的参数初始化外设I2Cx寄存器
输入参数1
I2Cx:
x可以是1或2,来选择I2C外设
输入参数2
I2C_InitStruct:
指向结构I2C_InitTypeDef的指针,包含了外设GPIO的配置信息
输出参数
无
返回值
无
先决条件
无
被调用函数
无
I2C_InitTypeDefstructure
I2C_InitTypeDef定义于文件:
typedefstruct
{
u16I2C_Mode;//FastMode?
StandardMode?
u16I2C_DutyCycle;//占空比:
1:
1?
1:
2?
9:
16?
u16I2C_OwnAddress1;//自地址?
u16I2C_Ack;//应答?
u16I2C_AcknowledgedAddress;//应答地址?
u32I2C_ClockSpeed;//时钟频率?
}I2C_InitTypeDef;
I2C_Mode:
用以设置I2C的模式。
Table208.给出了该参数可取的值
Table208.I2C_Mode值
参数I2C_Mode取值
描述/IIC_CR1.bit4/2
定义值
SMBTYPE
SMBUS
意义
I2C_Mode_I2C
设置I2C为I2C模式
0x0000
--
0
设置为IIC
I2C_Mode_SMBusDevice
设置I2C为SMBus设备模式
0x0002
0
1
SMBus设备模式
I2C_Mode_SMBusHost
设置I2C为SMBus主控模式
0x000A
1
1
SMBus主控模式
I2C_DutyCycle:
I2C_DutyCycle用以设置I2C的占空比。
Table209.I2C_DutyCycle值
参数I2C_DutyCycle取值
描述/I2C_CCR.DUTY/bit14
定义值
备注
I2C_DutyCycle_16_9
I2C快速模式Tlow/Thigh=16/9
(u16)0x4000
或操作
I2C_DutyCycle_2
I2C快速模式Tlow/Thigh=2
(u16)0xBFFF
与操作
注意:
该参数只有在I2C工作在快速模式(时钟工作频率高于100KHz)下才有意义。
I2C_OwnAddress1:
该参数用来设置第一个设备自身地址,它可以是一个7位或10位地址(<=0x3FF)。
I2C_Ack:
使能或失能应答(ACK)
Table210.I2C_Ack值
参数I2C_Ack取值
描述/I2C_CR1.bit10
定义值
I2C_Ack_Enable
使能ACK应答
(u16)0x0400
I2C_Ack_Disable
失能ACK应答
(u16)0x0000
I2C_AcknowledgedAddress:
定义了应答7位地址还是10位地址。
Table211.I2C_AcknowledgedAddres值
参数I2C_AcknowledgedAddres取值
描述/I2C_OAR1
定义值
bit15
bit14
I2C_AcknowledgeAddress_7bit
应答7位地址
(u16)0x4000
0
保持为1
I2C_AcknowledgeAddress_10bit
应答10位地址
(u16)0xC000
1
I2C_ClockSpeed:
该参数用来设置时钟频率,这个值不能高于400KHz(1Hz—400KHz)。
例:
/*InitializetheI2C1accordingtotheI2C_InitStructuremembers*/
I2C_InitTypeDefI2C_InitStructure;
I2C_InitStructure.I2C_Mode=I2C_Mode_SMBusHost;
I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1=0x03A2;
I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed=200000;
I2C_Init(I2C1,&I2C_InitStructure);
函数原型如下:
voidI2C_Init(I2C_TypeDef*I2Cx,I2C_InitTypeDef*I2C_InitStruct)
{
u16tmpreg=0,freqrange=0;
u16result=0x04;
u32pclk1=8000000;
RCC_ClocksTypeDefrcc_clocks;
/*Checktheparameters*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode));
assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle));
assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1));
assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack));
assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress));
assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed));
/*----------------------------I2CxCR2Configuration(外设时钟配置)------------------------*/
/*GettheI2CxCR2value*/
tmpreg=I2Cx->CR2;
/*ClearfrequencyFREQ[5:
0]bits*/
tmpreg&=CR2_FREQ_Reset;//0xFFE0
/*Getpclk1frequencyvalue*/
RCC_GetClocksFreq(&rcc_clocks);//选择HSI?
HSE?
PLLCLK?
pclk1=rcc_clocks.PCLK1_Frequency;//参看RCC_Clock结构体
/*Setfrequencybitsdependingonpclk1value*/
freqrange=(u16)(pclk1/1000000);//freqrange的单位是MHz(2MHz-36MHz)
tmpreg|=freqrange;
/*WritetoI2CxCR2*/
I2Cx->CR2=tmpreg;
/*----------------------------I2CxCCRConfiguration(设置分频系数和Trise时间)------------------*/
/*DisabletheselectedI2CperipheraltoconfigureTRISE*/
I2Cx->CR1&=CR1_PE_Reset;//0xFFFE
/*Resettmpregvalue*/
/*ClearF/S,DUTYandCCR[11:
0]bits*/
tmpreg=0;//清除CCR的三中控制:
F/S、DUTY、CCR[11:
0]
/*Configurespeedinstandardmode*/
if(I2C_InitStruct->I2C_ClockSpeed<=100000)
{
/*Standardmodespeedcalculate*/
result=(u16)(pclk1/(I2C_InitStruct->I2C_ClockSpeed<<1));//标准模式下的CCR.CCR[11:
0]的值
/*TestifCCRvalueisunder0x4*///标准模式下,CCR[11:
0]的最小值规定为4。
if(result<0x04)
{
/*Setminimumallowedvalue*/
result=0x04;
}
/*Setspeedvalueforstandardmode*/
tmpreg|=result;
/*SetMaximumRiseTimeforstandardmode*/
I2Cx->TRISE=freqrange+1;
//主模式的标准模式刚好是IIC模块的驱动频率:
//TRISE[5:
0]=Trise_scl*Fpclk1+1=1000ns*Fpclk1+1,(Fpclk1=freqrangeMHz),=freqrange+1
}
/*Configurespeedinfastmode*/
else/*(I2C_InitStruct->I2C_ClockSpeed<=400000)*/
{
if(I2C_InitStruct->I2C_DutyCycle==I2C_DutyCycle_2)
{
/*Fastmodespeedcalculate:
Tlow/Thigh=2*/
result=(u16)(pclk1/(I2C_InitStruct->I2C_ClockSpeed*3));//计算CCR[11:
0]的公式
}
else/*I2C_InitStruct->I2C_DutyCycle==I2C_DutyCycle_16_9*/
{
/*Fastmodespeedcalculate:
Tlow/Thigh=16/9*/
result=(u16)(pclk1/(I2C_InitStruct->I2C_ClockSpeed*25));//计算CCR[11:
0]的公式
/*SetDUTYbit*/
result|=I2C_DutyCycle_16_9;//16:
9的DUTY模式下,CCR.DUTY=1(bit14)
}
/*TestifCCRvalueisunder0x1*/
if((result&CCR_CCR_Set)==0)//0x0FFF
{
/*Setminimumallowedvalue*/
result|=(u16)0x0001;//快速模式下,CCR[11:
0]的最小值规定为1。
}
/*SetspeedvalueandsetF/Sbitforfastmode*/
tmpreg|=result|CCR_FS_Set;//0x8000(bit15=1—>Fast)
/*SetMaximumRiseTimeforfastmode*/
I2Cx->TRISE=(u16)(((freqrange*300)/1000)+1);//主模式的快速模式的Trise_scl=300ns。
}
/*WritetoI2CxCCR*/
I2Cx->CCR=tmpreg;
/*EnabletheselectedI2Cperipheral*/
I2Cx->CR1|=CR1_PE_Set;//0x0001
/*--------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32F10xIIC