source: azure_iot_hub_f767zi/trunk/asp_baseplatform/pdic/stm32f7xx/i2c.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 32.6 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2015-2018 by TOPPERS PROJECT Educational Working Group.
9 *
10 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19 * の無保証規定を掲載すること.
20 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22 * と.
23 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26 * 報告すること.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
30 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31 * 免責すること.
32 *
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
35 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
36 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
37 * の責任を負わない.
38 *
39 * @(#) $Id$
40 */
41/*
42 *
43 * I2Cドライバ関数群
44 *
45 */
46#include "kernel_impl.h"
47#include <t_syslog.h>
48#include <t_stdlib.h>
49#include <string.h>
50#include <sil.h>
51#include <target_syssvc.h>
52#include "kernel_cfg.h"
53#include "device.h"
54#include "i2c.h"
55
56#define sil_orw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) | (b))
57#define sil_andw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) & ~(b))
58#define sil_modw_mem(a, b, c) sil_wrw_mem((a), (sil_rew_mem(a) & (~b)) | (c))
59
60/*
61 * I2CポートIDから管理ブロックを取り出すためのマクロ
62 */
63#define INDEX_I2C(i2cid) ((uint_t)((i2cid) - 1))
64
65#define GPIO_AF4_I2C1 0x04 /* I2C1 Alternate Function mapping */
66#define GPIO_AF4_I2C2 0x04 /* I2C2 Alternate Function mapping */
67#define GPIO_AF4_I2C3 0x04 /* I2C3 Alternate Function mapping */
68#define GPIO_AF4_I2C4 0x04 /* I2C4 Alternate Function mapping */
69#define GPIO_AF11_I2C4 0x0B /* I2C4 Alternate Function mapping */
70
71/*
72 * I2Cポート設定テーブル
73 */
74static const I2C_PortControlBlock i2c_pcb[NUM_I2CPORT] = {
75 { TADR_I2C1_BASE,
76 (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOBEN, RCC_AHB1ENR_GPIOBEN,
77 (TADR_RCC_BASE+TOFF_RCC_APB1ENR), RCC_APB1ENR_I2C1EN,
78 (TADR_RCC_BASE+TOFF_RCC_APB1RSTR), RCC_APB1RSTR_I2C1RST,
79 TADR_GPIOB_BASE, TADR_GPIOB_BASE,
80 8, GPIO_AF4_I2C1, 9, GPIO_AF4_I2C1 },
81
82#if defined(TOPPERS_STM32F723_DISCOVERY)
83 { TADR_I2C2_BASE,
84 (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOHEN, RCC_AHB1ENR_GPIOHEN,
85 (TADR_RCC_BASE+TOFF_RCC_APB1ENR), RCC_APB1ENR_I2C2EN,
86 (TADR_RCC_BASE+TOFF_RCC_APB1RSTR), RCC_APB1RSTR_I2C2RST,
87 TADR_GPIOH_BASE, TADR_GPIOH_BASE,
88 4, GPIO_AF4_I2C2, 5, GPIO_AF4_I2C2 },
89
90 { TADR_I2C3_BASE,
91 (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOAEN, RCC_AHB1ENR_GPIOHEN,
92 (TADR_RCC_BASE+TOFF_RCC_APB1ENR), RCC_APB1ENR_I2C3EN,
93 (TADR_RCC_BASE+TOFF_RCC_APB1RSTR), RCC_APB1RSTR_I2C3RST,
94 TADR_GPIOA_BASE, TADR_GPIOH_BASE,
95 8, GPIO_AF4_I2C3, 8, GPIO_AF4_I2C3 },
96#else
97 { TADR_I2C2_BASE,
98 (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOHEN, RCC_AHB1ENR_GPIOHEN,
99 (TADR_RCC_BASE+TOFF_RCC_APB1ENR), RCC_APB1ENR_I2C2EN,
100 (TADR_RCC_BASE+TOFF_RCC_APB1RSTR), RCC_APB1RSTR_I2C2RST,
101 TADR_GPIOH_BASE, TADR_GPIOH_BASE,
102 1, GPIO_AF4_I2C2, 0, GPIO_AF4_I2C2 },
103
104 { TADR_I2C3_BASE,
105 (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOHEN, RCC_AHB1ENR_GPIOHEN,
106 (TADR_RCC_BASE+TOFF_RCC_APB1ENR), RCC_APB1ENR_I2C3EN,
107 (TADR_RCC_BASE+TOFF_RCC_APB1RSTR), RCC_APB1RSTR_I2C3RST,
108 TADR_GPIOH_BASE, TADR_GPIOH_BASE,
109 7, GPIO_AF4_I2C3, 8, GPIO_AF4_I2C3 },
110#endif
111
112#if defined(TOPPERS_STM32F769_DISCOVERY)
113 { TADR_I2C4_BASE,
114 (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIODEN, RCC_AHB1ENR_GPIOBEN,
115 (TADR_RCC_BASE+TOFF_RCC_APB1ENR), RCC_APB1ENR_I2C4EN,
116 (TADR_RCC_BASE+TOFF_RCC_APB1RSTR), RCC_APB1RSTR_I2C4RST,
117 TADR_GPIOD_BASE, TADR_GPIOB_BASE,
118 12, GPIO_AF4_I2C4, 7, GPIO_AF11_I2C4 }
119#else
120 { TADR_I2C4_BASE,
121 (TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIODEN, RCC_AHB1ENR_GPIODEN,
122 (TADR_RCC_BASE+TOFF_RCC_APB1ENR), RCC_APB1ENR_I2C4EN,
123 (TADR_RCC_BASE+TOFF_RCC_APB1RSTR), RCC_APB1RSTR_I2C4RST,
124 TADR_GPIOD_BASE, TADR_GPIOB_BASE,
125 12, GPIO_AF4_I2C4, 13, GPIO_AF4_I2C4 }
126#endif
127};
128
129static I2C_Handle_t I2cHandle[NUM_I2CPORT];
130
131/*
132 * I2C スタートストップモード定義
133 */
134#define I2C_NO_STARTSTOP 0x00000000
135
136/*
137 * I2C リロードエンドモード定義
138 */
139#define I2C_SOFTEND_MODE 0x00000000
140
141#define TIMING_CLEAR_MASK 0xF0FFFFFF /* I2C TIMING clear register Mask */
142
143#define I2C_CR1_TRANS1 (I2C_CR1_TCIE | I2C_CR1_STOPIE | I2C_CR1_NACKIE | I2C_CR1_TXIE | I2C_CR1_ADDRIE)
144#define I2C_CR1_TRANS2 (I2C_CR1_TCIE | I2C_CR1_STOPIE | I2C_CR1_NACKIE | I2C_CR1_TXIE)
145
146#define I2C_CR1_RECV1 (I2C_CR1_TCIE| I2C_CR1_STOPIE| I2C_CR1_NACKIE | I2C_CR1_RXIE | I2C_CR1_ADDRIE)
147#define I2C_CR1_RECV2 (I2C_CR1_TCIE| I2C_CR1_STOPIE| I2C_CR1_NACKIE | I2C_CR1_RXIE)
148#define I2C_CR1_ERROR (I2C_CR1_ERRIE | I2C_CR1_TCIE | I2C_CR1_STOPIE | I2C_CR1_NACKIE)
149#define I2C_CR2_RESET (I2C_CR2_SADD | I2C_CR2_HEAD10R | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_RD_WRN)
150
151/*
152 * I2Cデバイスの初期化
153 * parameter1 hi2c I2Cハンドラへのポインタ
154 * return 正常終了時、E_OK
155 */
156I2C_Handle_t *
157i2c_init(ID port, I2C_Init_t *pini)
158{
159 const I2C_PortControlBlock *ipcb;
160 GPIO_Init_t gpio_init;
161 I2C_Handle_t *hi2c;
162 volatile uint32_t tmp;
163 int no;
164
165 if(port < I2C1_PORTID || port > NUM_I2CPORT)
166 return NULL;
167 if(pini == NULL)
168 return NULL;
169
170 no = INDEX_I2C(port);
171 ipcb = &i2c_pcb[no];
172
173 hi2c = &I2cHandle[no];
174 if(hi2c->State != I2C_STATE_RESET)
175 return NULL;
176 memcpy(&hi2c->Init, pini, sizeof(I2C_Init_t));
177 hi2c->base = ipcb->base;
178 hi2c->State = I2C_STATE_BUSY;
179 hi2c->i2cid = port;
180
181 /*
182 * I2C-GPIOクロック設定
183 */
184 sil_orw_mem((uint32_t *)ipcb->gioclockbase, ipcb->gioclockbit1);
185 tmp = sil_rew_mem((uint32_t *)ipcb->gioclockbase);
186 sil_orw_mem((uint32_t *)ipcb->gioclockbase, ipcb->gioclockbit2);
187 tmp = sil_rew_mem((uint32_t *)ipcb->gioclockbase);
188
189 /*
190 * SCLピン設定
191 */
192 gpio_init.mode = GPIO_MODE_AF;
193 gpio_init.pull = GPIO_NOPULL;
194 gpio_init.otype = GPIO_OTYPE_OD;
195 gpio_init.speed = GPIO_SPEED_FAST;
196 gpio_init.alternate = ipcb->sclaf;
197 gpio_setup(ipcb->giobase1, &gpio_init, ipcb->sclpin);
198
199 /*
200 * SDAピン設定
201 */
202 gpio_init.alternate = ipcb->sdaaf;
203 gpio_setup(ipcb->giobase2, &gpio_init, ipcb->sdapin);
204
205 sil_orw_mem((uint32_t *)ipcb->i2cclockbase, ipcb->i2cclockbit);
206 tmp = sil_rew_mem((uint32_t *)ipcb->i2cclockbase);
207 (void)(tmp);
208 sil_orw_mem((uint32_t *)ipcb->i2cresetbase, ipcb->i2cresetbit);
209 sil_andw_mem((uint32_t *)ipcb->i2cresetbase, ipcb->i2cresetbit);
210
211 /* I2C Disable */
212 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), I2C_CR1_PE);
213
214 /*
215 * I2C TIMINGR設定
216 */
217 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_TIMINGR), (hi2c->Init.Timing & TIMING_CLEAR_MASK));
218
219 /*
220 * I2Cアドレス1設定
221 */
222 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_OAR1), I2C_OAR1_OA1EN);
223 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
224 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_OAR1), (I2C_OAR1_OA1EN | hi2c->Init.OwnAddress1));
225 else /* I2C_ADDRESSINGMODE_10BIT */
226 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_OAR1), (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hi2c->Init.OwnAddress1));
227
228 /*
229 * I2C CR2レジスタ設定
230 */
231 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
232 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), (I2C_CR2_ADD10));
233 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), (I2C_CR2_AUTOEND | I2C_CR2_NACK));
234
235 /*
236 * I2Cアドレス2設定
237 */
238 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_OAR2), (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2 | (hi2c->Init.OwnAddress2Masks << 8)));
239
240 /*
241 * I2C CR1レジスタ設定
242 */
243 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode));
244 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), I2C_CR1_PE);
245
246 hi2c->ErrorCode = I2C_ERROR_NONE;
247 hi2c->State = I2C_STATE_READY;
248 return hi2c;
249}
250
251/*
252 * I2Cデバイスの無効化
253 * parameter1 hi2c I2Cハンドラへのポインタ
254 * return 正常終了時、E_OK
255 */
256ER
257i2c_deinit(I2C_Handle_t *hi2c)
258{
259 /* ハンドラのチェック */
260 if(hi2c == NULL)
261 return E_PAR;
262
263 hi2c->State = I2C_STATE_BUSY;
264
265 /*
266 * I2Cクロック停止
267 */
268 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), I2C_CR1_PE);
269
270 hi2c->ErrorCode = I2C_ERROR_NONE;
271 hi2c->State = I2C_STATE_RESET;
272 return E_OK;
273}
274
275/*
276 * I2C通信のスタート設定
277 * parameter1 hi2c I2Cハンドラへのポインタ
278 * parameter2 DevAddress スレーブアドレス
279 * parameter3 Size メモリアドレスのサイズ
280 * parameter4 Mode 設定モード
281 * return なし
282 */
283static void
284i2c_transfarconfig(I2C_Handle_t *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
285{
286 uint32_t tmpreg = 0;
287
288 /*
289 * I2C CR2レジスタ再設定
290 */
291 tmpreg = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2));
292 tmpreg &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP));
293 tmpreg |= (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | (((uint32_t)Size << 16 ) & I2C_CR2_NBYTES) |
294 (uint32_t)Mode | (uint32_t)Request);
295 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), tmpreg);
296}
297
298/*
299 * I2Cフラグを指定して設定待ち関数
300 * parameter1 hi2c I2Cハンドラへのポインタ
301 * parameter2 Flag 待ちフラグ
302 * parameter3 Timeout タイムアウト時間(ms)
303 * return 正常終了 E_OK
304 */
305static ER
306i2c_waitsetflag(I2C_Handle_t *hi2c, uint32_t Flag, uint32_t Timeout)
307{
308 uint32_t tick = 0;
309
310 /*
311 * フラグ設定待ち
312 */
313 while((sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR)) & Flag) != Flag){
314 if(tick > Timeout){
315 hi2c->State= I2C_STATE_READY;
316 return E_TMOUT;
317 }
318 dly_tsk(1);
319 tick++;
320 }
321 return E_OK;
322}
323
324/*
325 * I2C スレーブアドレスとメモリアドレス設定
326 * parameter1 hi2c I2Cハンドラへのポインタ
327 * parameter2 DevAddress:スレーブアドレス
328 * parameter3 MemAddress:メモリアドレス
329 * parameter4 MemAddSize:メモリアドレスのサイズ
330 * parameter5 Mode :設定モード
331 * parameter6 Timeout:タイムアウト時間(ms)
332 * return 正常設定 E_OK
333 */
334static ER
335i2c_requestmemaddr(I2C_Handle_t *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Mode, uint32_t Timeout)
336{
337 ER err = E_OK;
338
339 i2c_transfarconfig(hi2c,DevAddress,MemAddSize, Mode, I2C_CR2_START);
340 /*
341 * TXISフラグ設定待ち
342 */
343 if((err = i2c_waitsetflag(hi2c, I2C_ISR_TXIS, Timeout)) != E_OK)
344 return err;
345
346 /*
347 * メモリアドレス設定
348 */
349 if(MemAddSize == I2C_MEMADD_SIZE_8BIT){ /* 8bit設定 */
350 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_TXDR), (MemAddress & 0xff));
351 }
352 else{ /* 16bit設定 */
353 /* メモリアドレスMSB設定 */
354 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_TXDR), ((MemAddress>>8) & 0xff));
355 if((err = i2c_waitsetflag(hi2c, I2C_ISR_TXIS, Timeout)) != E_OK)
356 return err;
357 /* メモリアドレスLSB設定 */
358 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_TXDR), (MemAddress & 0xff));
359 }
360 /*
361 * TC(R)フラグ設定待ち
362 */
363 if(Mode == I2C_SOFTEND_MODE)
364 err = i2c_waitsetflag(hi2c, I2C_ISR_TC, Timeout);
365 else
366 err = i2c_waitsetflag(hi2c, I2C_ISR_TCR, Timeout);
367 return err;
368}
369
370/*
371 * I2C転送待ち
372 * parameter1 hi2c I2Cハンドラへのポインタ
373 * parameter2 Timeout:タイムアウト時間(ms)
374 */
375static ER
376i2c_transwait(I2C_Handle_t *hi2c, uint32_t Timeout)
377{
378 uint32_t tick = 0;
379
380 while(hi2c->State != I2C_STATE_READY){
381 if(tick >= Timeout)
382 return E_TMOUT;
383 if(hi2c->Init.semid != 0)
384 twai_sem(hi2c->Init.semid, 1);
385 else
386 dly_tsk(1);
387 tick++;
388 }
389 return E_OK;
390}
391
392/*
393 * I2Cスレーブ受信
394 * parameter1 hi2c I2Cハンドラへのポインタ
395 * parameter2 pData: 読み出しバッファへのポインタ
396 * parameter3 Size: 読み出しサイズ
397 * return 正常終了ならE_OK
398 */
399ER
400i2c_slaveread(I2C_Handle_t *hi2c, uint8_t *pData, uint16_t Size)
401{
402 ER err = E_OK;
403
404 if(pData == NULL || Size == 0)
405 return E_PAR;
406
407 /*
408 * 読み出しロック
409 */
410 if(hi2c->Init.semlock != 0)
411 wai_sem(hi2c->Init.semlock);
412
413 if(hi2c->State != I2C_STATE_READY){
414 if(hi2c->Init.semlock != 0)
415 sig_sem(hi2c->Init.semlock);
416 return E_OBJ;
417 }
418
419 hi2c->State = I2C_STATE_SLAVE_BUSY_RX;
420 hi2c->ErrorCode = I2C_ERROR_NONE;
421
422 /*
423 * アドレス・アクノレッジ許可
424 */
425 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_NACK);
426
427 hi2c->pBuffPtr = pData;
428 hi2c->XferSize = Size;
429 hi2c->XferCount = Size;
430
431 /*
432 * 読み出し割込み許可
433 */
434 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), (I2C_CR1_ERROR | I2C_CR1_ADDRIE | I2C_CR1_RXIE));
435 err = i2c_transwait(hi2c, 500);
436
437 /*
438 * ロック解除
439 */
440 if(hi2c->Init.semlock != 0)
441 sig_sem(hi2c->Init.semlock);
442 return err;
443}
444
445/*
446 * I2Cスレーブ送信
447 * parameter1 hi2c I2Cハンドラへのポインタ
448 * parameter2 pData: 読み出しバッファへのポインタ
449 * parameter3 Size: 読み出しサイズ
450 * return 正常終了ならE_OK
451 */
452ER
453i2c_slavewrite(I2C_Handle_t *hi2c, uint8_t *pData, uint16_t Size)
454{
455 ER err = E_OK;
456
457 if(pData == NULL || Size == 0)
458 return E_PAR;
459
460 /*
461 * 読み出しロック
462 */
463 if(hi2c->Init.semlock != 0)
464 wai_sem(hi2c->Init.semlock);
465
466 if(hi2c->State != I2C_STATE_READY){
467 if(hi2c->Init.semlock != 0)
468 sig_sem(hi2c->Init.semlock);
469 return E_OBJ;
470 }
471
472 hi2c->State = I2C_STATE_SLAVE_BUSY_TX;
473 hi2c->ErrorCode = I2C_ERROR_NONE;
474
475 /*
476 * アドレス・アクノレッジ許可
477 */
478 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_NACK);
479
480 hi2c->pBuffPtr = pData;
481 hi2c->XferSize = Size;
482 hi2c->XferCount = Size;
483
484 /*
485 * 書き込み割込み許可
486 */
487 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), (I2C_CR1_ERROR | I2C_CR1_ADDRIE | I2C_CR1_TXIE));
488 err = i2c_transwait(hi2c, 500);
489
490 /*
491 * ロック解除
492 */
493 if(hi2c->Init.semlock != 0)
494 sig_sem(hi2c->Init.semlock);
495 return err;
496}
497
498/*
499 * I2Cマスターデータリード
500 * parameter1 hi2c I2Cハンドラへのポインタ
501 * parameter2 DevAddress: スレーブアドレス
502 * parameter3 MemAddress: メモリアドレス
503 * parameter4 MemAddSize: メモリアドレスサイズ
504 * parameter5 pData: 読み出しバッファへのポインタ
505 * parameter6 Size: 読み出しサイズ
506 * parameter7 Timeout: タイムアウト時間(ms)
507 * return 正常終了ならE_OK
508 */
509ER
510i2c_memread(I2C_Handle_t *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
511{
512 ER err = E_OK;
513 uint32_t Mode = I2C_CR2_RELOAD;
514
515 if((pData == NULL) || (Size == 0))
516 return E_PAR;
517
518 /*
519 * 読み出しロック
520 */
521 if(hi2c->Init.semlock != 0)
522 wai_sem(hi2c->Init.semlock);
523
524 if(hi2c->State != I2C_STATE_READY
525 || (sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR)) & I2C_ISR_BUSY) == I2C_ISR_BUSY){
526 if(hi2c->Init.semlock != 0)
527 sig_sem(hi2c->Init.semlock);
528 return E_OBJ;
529 }
530
531 hi2c->State = I2C_STATE_MASTER_BUSY_RX;
532 hi2c->ErrorCode = I2C_ERROR_NONE;
533
534 hi2c->pBuffPtr = pData;
535 hi2c->XferCount = Size;
536 if(Size > 255)
537 hi2c->XferSize = 255;
538 else
539 hi2c->XferSize = Size;
540
541 /* スレーブアドレスと読み出しアドレスの設定 */
542 if(MemAddSize != 0){
543 if((err = i2c_requestmemaddr(hi2c, DevAddress, MemAddress, MemAddSize, I2C_SOFTEND_MODE, Timeout)) != E_OK){
544 if(hi2c->Init.semlock != 0)
545 sig_sem(hi2c->Init.semlock);
546 return err;
547 }
548 }
549
550 /*
551 * アドレス書き込みフェーズ
552 */
553 if( (hi2c->XferSize == 255) && (hi2c->XferSize < hi2c->XferCount) )
554 Mode = I2C_CR2_RELOAD;
555 else
556 Mode = I2C_CR2_AUTOEND;
557 i2c_transfarconfig(hi2c, DevAddress, hi2c->XferSize, Mode, (I2C_CR2_START | I2C_CR2_RD_WRN));
558
559 /*
560 * 読み出し割込み許可
561 */
562 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), (I2C_CR1_ERROR | I2C_CR1_RXIE));
563 err = i2c_transwait(hi2c, Timeout);
564
565 /*
566 * ロック解除
567 */
568 if(hi2c->Init.semlock != 0)
569 sig_sem(hi2c->Init.semlock);
570 return err;
571}
572
573/*
574 * I2Cマスターデータライト
575 * parameter1 hi2c I2Cハンドラへのポインタ
576 * parameter2 DevAddress: スレーブアドレス
577 * parameter3 MemAddress: メモリアドレス
578 * parameter4 MemAddSize: メモリアドレスサイズ
579 * parameter5 pData: 書込みバッファへのポインタ
580 * parameter6 Size: 書込みサイズ
581 * parameter7 Timeout: タイムアウト時間(ms)
582 */
583ER
584i2c_memwrite(I2C_Handle_t *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
585{
586 ER err = E_OK;
587 uint32_t Mode = I2C_CR2_RELOAD;
588 uint32_t Request = I2C_CR2_START /*I2C_GENERATE_START_WRITE*/;
589
590 if((pData == NULL) || (Size == 0))
591 return E_PAR;
592
593 /*
594 * 書込みロック
595 */
596 if(hi2c->Init.semlock != 0)
597 wai_sem(hi2c->Init.semlock);
598
599 if(hi2c->State != I2C_STATE_READY
600 || (sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR)) & I2C_ISR_BUSY) == I2C_ISR_BUSY){
601 if(hi2c->Init.semlock != 0)
602 sig_sem(hi2c->Init.semlock);
603 return E_OBJ;
604 }
605
606 hi2c->State = I2C_STATE_MASTER_BUSY_TX;
607 hi2c->ErrorCode = I2C_ERROR_NONE;
608
609 hi2c->pBuffPtr = pData;
610 hi2c->XferCount = Size;
611 if(Size > 255)
612 hi2c->XferSize = 255;
613 else
614 hi2c->XferSize = Size;
615
616 /* スレーブアドレスと書込みアドレスの設定 */
617 if(MemAddSize != 0){
618 Request = I2C_NO_STARTSTOP;
619 if((err = i2c_requestmemaddr(hi2c, DevAddress, MemAddress, MemAddSize, I2C_CR2_RELOAD, Timeout)) != E_OK){
620 if(hi2c->Init.semlock != 0)
621 sig_sem(hi2c->Init.semlock);
622 return err;
623 }
624 }
625
626 /*
627 * アドレス書き込みフェーズ
628 */
629 if(hi2c->XferSize == 255 && hi2c->XferSize < hi2c->XferCount)
630 Mode = I2C_CR2_RELOAD;
631 else
632 Mode = I2C_CR2_AUTOEND;
633 i2c_transfarconfig(hi2c, DevAddress, hi2c->XferSize, Mode, Request);
634
635 /*
636 * 書き込み割込み許可
637 */
638 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), (I2C_CR1_ERROR | I2C_CR1_TXIE));
639 err = i2c_transwait(hi2c, Timeout);
640
641 /*
642 * ロック解除
643 */
644 if(hi2c->Init.semlock != 0)
645 sig_sem(hi2c->Init.semlock);
646 return err;
647}
648
649/*
650 * I2Cレディチェック
651 * parameter1 hi2c: I2Cハンドラへのポインタ
652 * parameter2 DevAddress: スレーブアドレス
653 * parameter3 Trials: トライアス値
654 * parameter4 Timeout: タイムアウト値
655 * return レディならE_OK
656 */
657ER
658i2c_ready(I2C_Handle_t *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
659{
660 volatile uint32_t I2C_Trials = 0;
661 uint32_t tick = 0;
662 uint32_t tmp;
663
664 if(hi2c->State == I2C_STATE_READY){
665 if((sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR)) & I2C_ISR_BUSY) != 0)
666 return E_OBJ;
667
668 /*
669 * アクセスロック
670 */
671 if(hi2c->Init.semlock != 0)
672 wai_sem(hi2c->Init.semlock);
673
674 hi2c->State = I2C_STATE_BUSY;
675 hi2c->ErrorCode = I2C_ERROR_NONE;
676
677 do{
678 /* スタート生成 */
679 if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
680 tmp = (((DevAddress & I2C_CR2_SADD) | I2C_CR2_START | I2C_CR2_AUTOEND) & ~I2C_CR2_RD_WRN);
681 else
682 tmp = (((DevAddress & I2C_CR2_SADD) | I2C_CR2_ADD10 | I2C_CR2_START) & ~I2C_CR2_RD_WRN);
683 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), tmp);
684
685 /*
686 * ストップフラグまたはNACKフラグ待ち
687 */
688 while((sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR)) & (I2C_ISR_STOPF | I2C_ISR_NACKF)) == 0){
689 if(tick > Timeout){
690 /* Device is ready */
691 hi2c->State = I2C_STATE_READY;
692 /*
693 * ロック解除
694 */
695 if(hi2c->Init.semlock != 0)
696 sig_sem(hi2c->Init.semlock);
697 return E_TMOUT;
698 }
699 dly_tsk(1);
700 tick++;
701 }
702
703 /* NACKフラグ状態 */
704 if((sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR)) & I2C_ISR_NACKF) == 0){
705 /* ストップフラグリセット待ち */
706 if(i2c_waitsetflag(hi2c, I2C_ISR_STOPF, Timeout) != E_OK){
707 /*
708 * ロック解除
709 */
710 if(hi2c->Init.semlock != 0)
711 sig_sem(hi2c->Init.semlock);
712 return E_TMOUT;
713 }
714
715 /* ストップフラグクリア */
716 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_STOPCF);
717
718 hi2c->State = I2C_STATE_READY;
719 /*
720 * ロック解除
721 */
722 if(hi2c->Init.semlock != 0)
723 sig_sem(hi2c->Init.semlock);
724 return E_OK;
725 }
726 else{ /* ストップフラグ状態 */
727 /* ストップフラグリセット待ち */
728 if(i2c_waitsetflag(hi2c, I2C_ISR_STOPF, Timeout) != E_OK){
729 /*
730 * ロック解除
731 */
732 if(hi2c->Init.semlock != 0)
733 sig_sem(hi2c->Init.semlock);
734 return E_TMOUT;
735 }
736
737 /* NACKフラグクリア */
738 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_NACKCF);
739
740 /* ストップフラグクリア */
741 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_STOPCF);
742 }
743
744 /* Check if the maximum allowed number of trials has been reached */
745 if(I2C_Trials++ == Trials){
746 /* ストップ生成 */
747 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_STOP);
748
749 /* ストップフラグリセット待ち */
750 if(i2c_waitsetflag(hi2c, I2C_ISR_STOPF, Timeout) != E_OK){
751 /*
752 * ロック解除
753 */
754 if(hi2c->Init.semlock != 0)
755 sig_sem(hi2c->Init.semlock);
756 return E_TMOUT;
757 }
758
759 /* ストップフラグクリア */
760 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_STOPCF);
761 }
762 }while(I2C_Trials < Trials);
763
764 hi2c->State = I2C_STATE_READY;
765 /*
766 * ロック解除
767 */
768 if(hi2c->Init.semlock != 0)
769 sig_sem(hi2c->Init.semlock);
770 return E_TMOUT;
771 }
772 else
773 return E_OBJ;
774}
775
776/*
777 * I2Cマスター送信割込み
778 */
779static void
780i2c_mastertrans_isr(I2C_Handle_t *hi2c)
781{
782 uint32_t isr = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR));
783 uint16_t DevAddress;
784
785 if((isr & I2C_ISR_TXIS) != 0){ /* 送信中 */
786 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_TXDR), (*hi2c->pBuffPtr++));
787 hi2c->XferSize--;
788 hi2c->XferCount--;
789 }
790 else if((isr & I2C_ISR_TCR) != 0){ /* 送信再設定 */
791 if(hi2c->XferSize == 0 && hi2c->XferCount != 0){
792 DevAddress = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2)) & I2C_CR2_SADD;
793 if(hi2c->XferCount > 255){
794 i2c_transfarconfig(hi2c,DevAddress,255, I2C_CR2_RELOAD, I2C_NO_STARTSTOP);
795 hi2c->XferSize = 255;
796 }
797 else{
798 i2c_transfarconfig(hi2c,DevAddress,hi2c->XferCount, I2C_CR2_AUTOEND, I2C_NO_STARTSTOP);
799 hi2c->XferSize = hi2c->XferCount;
800 }
801 }
802 else{ /* サイズエラー */
803 hi2c->ErrorCode |= I2C_ERROR_SIZE;
804 if(hi2c->errorcallback != NULL)
805 hi2c->errorcallback(hi2c);
806 }
807 }
808 else if((isr & I2C_ISR_TC) != 0){ /* 送信終了 */
809 if(hi2c->XferCount == 0){
810 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_STOP);
811 }
812 else{ /* サイズエラー */
813 hi2c->ErrorCode |= I2C_ERROR_SIZE;
814 if(hi2c->errorcallback != NULL)
815 hi2c->errorcallback(hi2c);
816 }
817 }
818 else if((isr & I2C_ISR_STOPF) != 0){ /* ストップフラグ */
819 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), (I2C_CR1_ERROR | I2C_CR1_TXIE));
820 /*
821 * ストップフラグクリア
822 */
823 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_STOPCF);
824 /*
825 * CR2をクリア
826 */
827 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_RESET);
828 hi2c->State = I2C_STATE_READY;
829 if(hi2c->writecallback != NULL)
830 hi2c->writecallback(hi2c);
831 }
832 else if((isr & I2C_ISR_NACKF) != 0){ /* NACKフラグ */
833 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_NACKCF);
834 hi2c->ErrorCode |= I2C_ERROR_AF;
835 if(hi2c->errorcallback != NULL)
836 hi2c->errorcallback(hi2c);
837 }
838}
839
840/*
841 * I2Cマスター受信割込み
842 */
843static void
844i2c_masterreceiv_isr(I2C_Handle_t *hi2c)
845{
846 uint32_t isr = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR));
847 uint16_t DevAddress;
848
849 if((isr & I2C_ISR_RXNE) != 0){ /* 受信中 */
850 (*hi2c->pBuffPtr++) = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_RXDR));
851 hi2c->XferSize--;
852 hi2c->XferCount--;
853 }
854 else if((isr & I2C_ISR_TCR) != 0){ /* 受信継続 */
855 if(hi2c->XferSize == 0 && hi2c->XferCount != 0){
856 DevAddress = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2)) & I2C_CR2_SADD;
857 if(hi2c->XferCount > 255){
858 i2c_transfarconfig(hi2c, DevAddress, 255, I2C_CR2_RELOAD, I2C_NO_STARTSTOP);
859 hi2c->XferSize = 255;
860 }
861 else{
862 i2c_transfarconfig(hi2c, DevAddress, hi2c->XferCount, I2C_CR2_AUTOEND, I2C_NO_STARTSTOP);
863 hi2c->XferSize = hi2c->XferCount;
864 }
865 }
866 else{ /* サイズエラー */
867 hi2c->ErrorCode |= I2C_ERROR_SIZE;
868 if(hi2c->errorcallback != NULL)
869 hi2c->errorcallback(hi2c);
870 }
871 }
872 else if((isr & I2C_ISR_TC) != 0){ /* 受信終了 */
873 if(hi2c->XferCount == 0){
874 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_STOP);
875 }
876 else{
877 /* Wrong size Status regarding TCR flag event */
878 hi2c->ErrorCode |= I2C_ERROR_SIZE;
879 if(hi2c->errorcallback != NULL)
880 hi2c->errorcallback(hi2c);
881 }
882 }
883 else if((isr & I2C_ISR_STOPF) != 0){ /* ストップフラグ */
884 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), (I2C_CR1_ERROR | I2C_CR1_RXIE));
885 /*
886 * ストップフラグクリア
887 */
888 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_STOPCF);
889 /*
890 * CR2をクリア
891 */
892 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_RESET);
893 hi2c->State = I2C_STATE_READY;
894 if(hi2c->readcallback != NULL)
895 hi2c->readcallback(hi2c);
896 }
897 else if((isr & I2C_ISR_NACKF) != 0){ /* NACKフラグ */
898 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_NACKCF);
899 hi2c->ErrorCode |= I2C_ERROR_AF;
900 if(hi2c->errorcallback != NULL)
901 hi2c->errorcallback(hi2c);
902 }
903}
904
905/*
906 * I2Cスレーブ送信割込み
907 */
908static void
909i2c_slavesend_isr(I2C_Handle_t *hi2c)
910{
911 uint32_t isr = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR));
912
913 if((isr & I2C_ISR_NACKF) != 0){ /* NACKフラグ */
914 if(hi2c->XferCount == 0){ /* NACKをクリア */
915 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_NACKCF);
916 }
917 else{ /* データありでアクノレッジなしエラー */
918 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_NACKCF);
919 hi2c->ErrorCode |= I2C_ERROR_AF;
920 if(hi2c->errorcallback != NULL)
921 hi2c->errorcallback(hi2c);
922 }
923 }
924 else if((isr & I2C_ISR_ADDR) != 0){
925 /* Clear ADDR flag */
926 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_ADDRCF);
927 }
928 else if((isr & I2C_ISR_STOPF) != 0){ /* ストップフラグ */
929 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), (I2C_CR1_ERROR | I2C_CR1_ADDRIE | I2C_CR1_RXIE | I2C_CR1_TXIE));
930 /*
931 * アドレス・アクノレッジ禁止
932 */
933 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_NACK);
934 /*
935 * ストップフラグクリア
936 */
937 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_STOPCF);
938 hi2c->State = I2C_STATE_READY;
939 if(hi2c->writecallback != NULL)
940 hi2c->writecallback(hi2c);
941 }
942 else if((isr & I2C_ISR_TXIS) != 0){ /* 送信状態 */
943 if(hi2c->XferCount > 0){
944 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_TXDR), (*hi2c->pBuffPtr++));
945 hi2c->XferCount--;
946 }
947 }
948}
949
950/*
951 * I2Cスレーブ受信割込み
952 */
953static void
954i2c_slavereceiv_isr(I2C_Handle_t *hi2c)
955{
956 uint32_t isr = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR));
957
958 if((isr & I2C_ISR_NACKF) != 0){ /* NACKフラグ */
959 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_NACKCF);
960 hi2c->ErrorCode |= I2C_ERROR_AF;
961 if(hi2c->errorcallback != NULL)
962 hi2c->errorcallback(hi2c);
963 }
964 else if((isr & I2C_ISR_ADDR) != 0){ /* アドレスマッチ */
965 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_ADDRCF);
966 }
967 else if((isr & I2C_ISR_RXNE) != 0){ /* 受信中 */
968 (*hi2c->pBuffPtr++) = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_RXDR));
969 hi2c->XferSize--;
970 hi2c->XferCount--;
971 }
972 else if((isr & I2C_ISR_STOPF) != 0){/* ストップフラグ */
973 sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), (I2C_CR1_ERROR | I2C_CR1_ADDRIE | I2C_CR1_RXIE));
974 /*
975 * アドレス・アクノレッジ禁止
976 */
977 sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_NACK);
978 /*
979 * ストップフラグクリア
980 */
981 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_STOPCF);
982 hi2c->State = I2C_STATE_READY;
983 if(hi2c->readcallback != NULL)
984 hi2c->readcallback(hi2c);
985 }
986}
987
988/*
989 * I2C EV割込みハンドラ
990 */
991void
992i2c_ev_handler(I2C_Handle_t *hi2c)
993{
994 uint32_t cr1 = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1));
995 uint32_t isr = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR));
996
997 /*
998 * I2C スレーブ送信モード
999 */
1000 if(((isr & (I2C_ISR_TXIS | I2C_ISR_TCR | I2C_ISR_TC | I2C_ISR_STOPF | I2C_ISR_NACKF | I2C_ISR_ADDR)) != 0) && ((cr1 & I2C_CR1_TRANS1) == I2C_CR1_TRANS1)){
1001 if(hi2c->State == I2C_STATE_SLAVE_BUSY_TX){
1002 i2c_slavesend_isr(hi2c);
1003 }
1004 }
1005 isr = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR));
1006
1007 /*
1008 * I2C マスター送信モード
1009 */
1010 if(((isr & (I2C_ISR_TXIS | I2C_ISR_TCR | I2C_ISR_TC | I2C_ISR_STOPF | I2C_ISR_NACKF)) != 0) && ((cr1 & I2C_CR1_TRANS2) == I2C_CR1_TRANS2)){
1011 if(hi2c->State == I2C_STATE_MASTER_BUSY_TX){
1012 i2c_mastertrans_isr(hi2c);
1013 }
1014 }
1015 isr = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR));
1016
1017 /*
1018 * I2C スレーブ受信モード
1019 */
1020 if(((isr & (I2C_ISR_RXNE | I2C_ISR_TCR | I2C_ISR_TC | I2C_ISR_STOPF | I2C_ISR_NACKF | I2C_ISR_ADDR)) != 0) && ((cr1 & I2C_CR1_RECV1) == I2C_CR1_RECV1)){
1021 if(hi2c->State == I2C_STATE_SLAVE_BUSY_RX){
1022 i2c_slavereceiv_isr(hi2c);
1023 }
1024 }
1025 isr = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR));
1026
1027 /*
1028 * I2C マスター受信モード
1029 */
1030 if(((isr & (I2C_ISR_RXNE | I2C_ISR_TCR | I2C_ISR_TC | I2C_ISR_STOPF | I2C_ISR_NACKF)) != 0) && ((cr1 & I2C_CR1_RECV2) == I2C_CR1_RECV2)){
1031 if(hi2c->State == I2C_STATE_MASTER_BUSY_RX){
1032 i2c_masterreceiv_isr(hi2c);
1033 }
1034 }
1035
1036 if(hi2c->State == I2C_STATE_READY && hi2c->Init.semid != 0)
1037 isig_sem(hi2c->Init.semid);
1038}
1039
1040/*
1041 * I2C ER割込みハンドラ
1042 */
1043void
1044i2c_er_handler(I2C_Handle_t *hi2c)
1045{
1046 uint32_t cr1 = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1));
1047
1048 /*
1049 * I2C バスエラー
1050 */
1051 if(((sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR)) & I2C_ISR_BERR) != 0) && ((cr1 & I2C_CR1_ERRIE) != 0)){
1052 hi2c->ErrorCode |= I2C_ERROR_BERR;
1053 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_BERRCF);
1054 }
1055
1056 /*
1057 * I2C オーバーラン/アンダーラン
1058 */
1059 if(((sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR)) & I2C_ISR_OVR) != 0) && ((cr1 & I2C_CR1_ERRIE) != 0)){
1060 hi2c->ErrorCode |= I2C_ERROR_OVR;
1061 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_OVRCF);
1062 }
1063
1064 /*
1065 * I2C アービトレーション・ロス・エラー
1066 */
1067 if(((sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_ISR)) & I2C_ISR_ARLO) != 0) && ((cr1 & I2C_CR1_ERRIE) != 0)){
1068 hi2c->ErrorCode |= I2C_ERROR_ARLO;
1069 sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_ICR), I2C_ICR_ARLOCF);
1070 }
1071
1072 /*
1073 * エラーコールバック関数呼び出し
1074 */
1075 if(hi2c->ErrorCode != I2C_ERROR_NONE){
1076 hi2c->State = I2C_STATE_READY;
1077 if(hi2c->errorcallback != NULL)
1078 hi2c->errorcallback(hi2c);
1079 }
1080}
1081
1082/*
1083 * I2C EV割込みサービスルーチン
1084 */
1085void
1086i2c_ev_isr(intptr_t exinf)
1087{
1088 i2c_ev_handler(&I2cHandle[INDEX_I2C((uint32_t)exinf)]);
1089}
1090
1091/*
1092 * I2C ER割込みサービスルーチン
1093 */
1094void
1095i2c_er_isr(intptr_t exinf)
1096{
1097 i2c_er_handler(&I2cHandle[INDEX_I2C((uint32_t)exinf)]);
1098}
1099
Note: See TracBrowser for help on using the repository browser.