📄 stm32f10x_i2c.lst
字号:
##############################################################################
# #
# IAR ARM ANSI C/C++ Compiler V4.42A/W32 15/May/2008 12:06:31 #
# Copyright 1999-2005 IAR Systems. All rights reserved. #
# #
# Cpu mode = thumb #
# Endian = little #
# Stack alignment = 4 #
# Source file = C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\FWLib\src\stm32f10x_i2c.c #
# Command line = "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\FWLib\src\stm32f10x_i2c.c" -D #
# VECT_TAB_FLASH -lcN "C:\David JIANG\ST #
# MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\project\EWARM\BOOT_FLASH\List\" -lb #
# "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\project\EWARM\BOOT_FLASH\List\" -o #
# "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\project\EWARM\BOOT_FLASH\Obj\" -z3 #
# --no_cse --no_unroll --no_inline --no_code_motion #
# --no_tbaa --no_clustering --no_scheduling --debug #
# --cpu_mode thumb --endian little --cpu cortex-M3 #
# --stack_align 4 --require_prototypes --fpu None #
# --dlib_config "C:\Program Files\IAR #
# Systems\Embedded Workbench #
# 4.0\arm\LIB\dl7mptnnl8f.h" -I "C:\David JIANG\ST #
# MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\project\EWARM\" -I "C:\David #
# JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\project\EWARM\..\include\" -I #
# "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\project\EWARM\..\..\FWLib\inc\" -I #
# "C:\Program Files\IAR Systems\Embedded Workbench #
# 4.0\arm\INC\" #
# List file = C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\project\EWARM\BOOT_FLASH\List\stm32f #
# 10x_i2c.lst #
# Object file = C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM #
# Encoder\example\project\EWARM\BOOT_FLASH\Obj\stm32f1 #
# 0x_i2c.r79 #
# #
# #
##############################################################################
C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM Encoder\example\FWLib\src\stm32f10x_i2c.c
1 /******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
2 * File Name : stm32f10x_i2c.c
3 * Author : MCD Application Team
4 * Date First Issued : 09/29/2006
5 * Description : This file provides all the I2C firmware functions.
6 ********************************************************************************
7 * History:
8 * 05/21/2007: V0.3
9 * 04/02/2007: V0.2
10 * 02/05/2007: V0.1
11 * 09/29/2006: V0.01
12 ********************************************************************************
13 * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
14 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
15 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
16 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
17 * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
18 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
19 *******************************************************************************/
20
21 /* Includes ------------------------------------------------------------------*/
22 #include "stm32f10x_i2c.h"
23 #include "stm32f10x_rcc.h"
24
25 /* Private typedef -----------------------------------------------------------*/
26 /* Private define ------------------------------------------------------------*/
27 /* I2C SPE mask */
28 #define CR1_PE_Set ((u16)0x0001)
29 #define CR1_PE_Reset ((u16)0xFFFE)
30
31 /* I2C DMAEN mask */
32 #define CR2_DMAEN_Set ((u16)0x0800)
33 #define CR2_DMAEN_Reset ((u16)0xF7FF)
34
35 /* I2C LAST mask */
36 #define CR2_LAST_Set ((u16)0x1000)
37 #define CR2_LAST_Reset ((u16)0xEFFF)
38
39 /* I2C START mask */
40 #define CR1_START_Set ((u16)0x0100)
41 #define CR1_START_Reset ((u16)0xFEFF)
42
43 /* I2C STOP mask */
44 #define CR1_STOP_Set ((u16)0x0200)
45 #define CR1_STOP_Reset ((u16)0xFDFF)
46
47 /* I2C ACK mask */
48 #define CR1_ACK_Set ((u16)0x0400)
49 #define CR1_ACK_Reset ((u16)0xFBFF)
50
51 /* I2C ENGC mask */
52 #define CR1_ENGC_Set ((u16)0x0040)
53 #define CR1_ENGC_Reset ((u16)0xFFBF)
54
55 /* I2C ADD0 mask */
56 #define OAR1_ADD0_Set ((u16)0x0001)
57 #define OAR1_ADD0_Reset ((u16)0xFFFE)
58
59 /* I2C SWRST mask */
60 #define CR1_SWRST_Set ((u16)0x8000)
61 #define CR1_SWRST_Reset ((u16)0x7FFF)
62
63 /* I2C PEC mask */
64 #define CR1_PEC_Set ((u16)0x1000)
65 #define CR1_PEC_Reset ((u16)0xEFFF)
66
67 /* I2C ENPEC mask */
68 #define CR1_ENPEC_Set ((u16)0x0020)
69 #define CR1_ENPEC_Reset ((u16)0xFFDF)
70
71 /* I2C ENARP mask */
72 #define CR1_ENARP_Set ((u16)0x0010)
73 #define CR1_ENARP_Reset ((u16)0xFFEF)
74
75 /* I2C NOSTRETCH mask */
76 #define CR1_NOSTRETCH_Set ((u16)0x0080)
77 #define CR1_NOSTRETCH_Reset ((u16)0xFF7F)
78
79 /* I2C ENDUAL mask */
80 #define OAR2_ENDUAL_Set ((u16)0x0001)
81 #define OAR2_ENDUAL_Reset ((u16)0xFFFE)
82
83 /* I2C F/S mask */
84 #define CCR_FS_Set ((u16)0x8000)
85
86 /* I2C ADD2 mask */
87 #define OAR2_ADD2_Reset ((u16)0xFF01)
88
89 /* I2C FREQ mask */
90 #define CR2_FREQ_Reset ((u16)0xFFC0)
91
92 /* I2C CCR mask */
93 #define CCR_CCR_Set ((u16)0x0FFF)
94
95 /* I2C FLAG mask */
96 #define I2C_FLAG_Mask ((u32)0x00FFFFFF)
97
98 /* I2C registers Masks */
99 #define CR1_CLEAR_Mask ((u16)0xFBF5)
100
101 /* Private macro -------------------------------------------------------------*/
102 /* Private variables ---------------------------------------------------------*/
103 /* Private function prototypes -----------------------------------------------*/
104 /* Private functions ---------------------------------------------------------*/
105
106 /*******************************************************************************
107 * Function Name : I2C_DeInit
108 * Description : Deinitializes the I2Cx peripheral registers to their default
109 * reset values.
110 * Input : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
111 * Output : None
112 * Return : None
113 *******************************************************************************/
114 void I2C_DeInit(I2C_TypeDef* I2Cx)
115 {
116 switch (*(u32*)&I2Cx)
117 {
118 case I2C1_BASE:
119 /* Enable I2C1 reset state */
120 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
121 /* Release I2C1 from reset state */
122 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
123 break;
124
125 case I2C2_BASE:
126 /* Enable I2C2 reset state */
127 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
128 /* Release I2C2 from reset state */
129 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
130 break;
131
132 default:
133 break;
134 }
135 }
136
137 /*******************************************************************************
138 * Function Name : I2C_Init
139 * Description : Initializes the I2Cx peripheral according to the specified
140 * parameters in the I2C_InitStruct.
141 * Input : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
142 * - I2C_InitStruct: pointer to a I2C_InitTypeDef structure that
143 * contains the configuration information for the specified
144 * I2C peripheral.
145 * Output : None
146 * Return : None
147 ******************************************************************************/
148 void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)
149 {
150 u16 tmpreg = 0, freqrange = 0;
151 u16 result = 0x04;
152 u32 pclk1clock = 12000000;
153 RCC_ClocksTypeDef RCC_Clocks;
154
155 /* Check the parameters */
156 assert(IS_I2C_MODE(I2C_InitStruct->I2C_Mode));
157 assert(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle));
158 assert(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1));
159 assert(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack));
160 assert(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress));
161 assert(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed));
162
163 /*---------------------------- I2Cx CR2 Configuration ------------------------*/
164 /* Get the I2Cx CR2 value */
165 tmpreg = I2Cx->CR2;
166 /* Clear frequency FREQ[5:0] bits */
167 tmpreg &= CR2_FREQ_Reset;
168 /* Get PCLK1Clock frequency value */
169 RCC_GetClocksFreq(&RCC_Clocks);
170 pclk1clock = RCC_Clocks.PCLK1_Frequency;
171 /* Set frequency bits depending on PCLK1Clock value */
172 freqrange = (u16)(pclk1clock / 1000000);
173 tmpreg |= freqrange;
174 /* Write to I2Cx CR2 */
175 I2Cx->CR2 = tmpreg;
176
177 /*---------------------------- I2Cx CCR Configuration ------------------------*/
178 /* Disable I2Cx to configure TRISE */
179 I2C_Cmd(I2Cx, DISABLE);
180
181 /* Reset tmpreg value */
182 /* Clear F/S, DUTY and CCR[11:0] bits */
183 tmpreg = 0;
184
185 /* Configure speed in standard mode */
186 if (I2C_InitStruct->I2C_ClockSpeed <= 100000)
187 {
188 /* Standard mode speed calculate */
189 result = (u16)(pclk1clock / (I2C_InitStruct->I2C_ClockSpeed << 1));
190 /* Test if CCR value is under 0x4*/
191 if (result < 0x04)
192 {
193 /* Set minimum allowed value */
194 result = 0x04;
195 }
196 /* Set speed value for standard mode */
197 tmpreg |= result;
198 /* Set Maximum Rise Time: ((1000/(1000000000/pclk1clock))+1 */
199 I2Cx->TRISE = freqrange + 1;
200 }
201 /* Configure speed in fast mode */
202 else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/
203 {
204 if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2)
205 {
206 /* Fast mode speed calculate: Tlow/Thigh = 2 */
207 result = (u16)(pclk1clock / (I2C_InitStruct->I2C_ClockSpeed * 3));
208 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -