source: azure_iot_hub_riscv/trunk/asp_baseplatform/OBJ/K210_GCC/I2C/i2ctest.c@ 453

Last change on this file since 453 was 453, 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: 8.7 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) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2012 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2015-2017 by TOPPERS PROJECT Educational Working Group.
11 *
12 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33 * 免責すること.
34 *
35 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * の責任を負わない.
40 *
41 * $Id$
42 */
43
44/*
45 * I2Cテストの本体
46 * 本テストはmaxi bitにブレッドボードにI2Cシールドを接続してテスト
47 * maxidunoでは電気的な問題で通信エラーとなる.
48 */
49
50#include <kernel.h>
51#include <t_syslog.h>
52#include <t_stdlib.h>
53#include <sil.h>
54#include "syssvc/serial.h"
55#include "syssvc/syslog.h"
56#include "kernel_cfg.h"
57#include <target_syssvc.h>
58#include <string.h>
59#include "device.h"
60#include "pinmode.h"
61#include "i2ctest.h"
62
63/*
64 * サービスコールのエラーのログ出力
65 */
66Inline void
67svc_perror(const char *file, int_t line, const char *expr, ER ercd)
68{
69 if (ercd < 0) {
70 t_perror(LOG_ERROR, file, line, expr, ercd);
71 }
72}
73
74#define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
75
76
77#define RXBUFFERSIZE 12
78
79/*
80 * スレーブアドレス定義
81 */
82#define LCD_ADDR (0x3E<<1)
83#define EEPROM_ADDR (0x50<<1)
84#define ADT7410_ADDR (0x48<<1)
85
86#define ADT7410_TEMP_H 0x00
87#define ADT7410_TEMP_L 0x01
88#define ADT7410_STATUS 0x02
89
90#define LCD_locate(h, x, y) aqm0802_set_command((h), (0x80 + ((y) << 6) + (x)))
91#define LCD_puts(h, b) aqm0802_set_data((h), (b), strlen((const char *)(b)))
92
93
94/* Buffer used for reception */
95uint8_t aRxBuffer[RXBUFFERSIZE];
96
97uint8_t lcd_buf[2][12];
98
99/*
100 * I2C SEND CALLBACK FUNCTION
101 */
102static void
103I2C_TxCpltCallback(I2C_Handle_t *hi2c)
104{
105 syslog_1(LOG_DEBUG, "## I2C_TxCpltCallback(%08x) ##", hi2c);
106}
107
108/*
109 * I2C RECEIVE CALLBACK
110 */
111static void
112I2C_RxCpltCallback(I2C_Handle_t *hi2c)
113{
114 syslog_1(LOG_DEBUG, "## I2C_RxCpltCallback(%08x) ##", hi2c);
115}
116
117/*
118 * I2C ERROR CALLBACK
119 */
120static void
121I2C_ErrorCallback(I2C_Handle_t *hi2c)
122{
123 syslog_1(LOG_ERROR, "## I2C_ErrorCallback(%08x) ##", hi2c);
124}
125
126static void
127set_value(uint8_t *buf, int value)
128{
129 buf[1] = (value % 10) + '0';
130 buf[0] = (value / 10) + '0';
131}
132
133static void
134set_time(uint8_t *buf, long time)
135{
136 int wk = time/1000;
137 set_value(&buf[6], wk % 60);
138 wk = wk / 60;
139 buf[5] = ':';
140 set_value(&buf[3], wk % 60);
141 wk = wk / 60;
142 buf[2] = ':';
143 set_value(&buf[0], wk);
144}
145
146/*
147 * メインタスク
148 */
149void main_task(intptr_t exinf)
150{
151 I2C_Init_t i2c_initd;
152 I2C_Handle_t *hi2c;
153 CLCD_Handler_t CLcdHandle;
154 ER_UINT ercd;
155 SYSTIM tim;
156 uint16_t temp;
157 uint32_t count = 0;
158
159 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
160 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
161
162 /*
163 * シリアルポートの初期化
164 *
165 * システムログタスクと同じシリアルポートを使う場合など,シリアル
166 * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
167 * ない.
168 */
169 ercd = serial_opn_por(TASK_PORTID);
170 if (ercd < 0 && MERCD(ercd) != E_OBJ) {
171 syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
172 itron_strerror(ercd), SERCD(ercd));
173 }
174 SVC_PERROR(serial_ctl_por(TASK_PORTID,
175 (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
176
177 syslog_1(LOG_NOTICE, "I2C SEND/RECV START(%d)", I2C_PORTID);
178
179 i2c_initd.ClockSpeed = 100000;
180 i2c_initd.OwnAddress1 = 0;
181 i2c_initd.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
182 i2c_initd.SclPin = getGpioPin(15);
183 i2c_initd.SdaPin = getGpioPin(14);
184 i2c_initd.semid = I2CTRS_SEM;
185 i2c_initd.semlock = I2CLOC_SEM;
186 syslog_2(LOG_NOTICE, "I2C SDAPIN(%d) SCLPIN(%d)", i2c_initd.SdaPin, i2c_initd.SclPin);
187
188 if((hi2c = i2c_init(I2C_PORTID, &i2c_initd)) == NULL){
189 /* Initialization Error */
190 syslog_0(LOG_ERROR, "## I2C ERROR(1) ##");
191 }
192 syslog_1(LOG_NOTICE, "LCD INITAILIZE(%d) !", I2C_PORTID);
193
194 hi2c->writecallback = I2C_TxCpltCallback;
195 hi2c->readcallback = I2C_RxCpltCallback;
196 hi2c->errorcallback = I2C_ErrorCallback;
197
198 memset(&lcd_buf[0][0], ' ', 8);
199 memset(&lcd_buf[1][0], ' ', 8);
200
201 CLcdHandle.hi2c = hi2c;
202 CLcdHandle.saddr = LCD_ADDR;
203 if((ercd = aqm0802_init(&CLcdHandle)) != E_OK){
204 syslog_2(LOG_ERROR, "## LCD INIT ERROR(%d)[%08x] ##", ercd, hi2c->ErrorCode);
205 goto stop_task;
206 }
207
208 get_tim(&tim);
209 set_time(&lcd_buf[0][0], tim);
210 LCD_locate(&CLcdHandle, 0, 0);
211 LCD_puts(&CLcdHandle, &lcd_buf[0][0]);
212
213 dly_tsk(200);
214#ifdef EEPROM_ADDR
215 syslog_1(LOG_NOTICE, "READ EEPROM [%08x] !", aRxBuffer);
216 dly_tsk(200);
217 if(i2c_memread(hi2c, (uint16_t)EEPROM_ADDR, 0, I2C_MEMADD_SIZE_16BIT, (uint8_t*)aRxBuffer, RXBUFFERSIZE)!= E_OK){
218 /* I2C RECEIVE ERROR */
219 syslog_1(LOG_ERROR, "## I2C ERROR(12)[%08x] ##", hi2c->ErrorCode);
220 goto stop_task;
221 }
222#endif
223
224 syslog_0(LOG_NOTICE, "TEMP SENSER !");
225 do{
226 /* STATUS READ */
227 if(i2c_memread(hi2c, (uint16_t)ADT7410_ADDR, ADT7410_STATUS, I2C_MEMADD_SIZE_8BIT, (uint8_t*)aRxBuffer, 1)!= E_OK){
228 /* I2C RECEIVE ERROR */
229 syslog_1(LOG_ERROR, "## I2C ERROR(13)[%08x] ##", hi2c->ErrorCode);
230 goto stop_task;
231 }
232 temp = aRxBuffer[0];
233 syslog_1(LOG_NOTICE, "## temp[%02x] ##", temp);
234 }while((temp & 0x80) != 0);
235
236#if 1
237 while(count < 1000){
238 if(i2c_memread(hi2c, (uint16_t)ADT7410_ADDR, ADT7410_TEMP_H, I2C_MEMADD_SIZE_8BIT, (uint8_t*)aRxBuffer, 1)!= E_OK){
239 /* I2C RECEIVE ERROR */
240 syslog_1(LOG_ERROR, "## I2C ERROR(14)[%08x] ##", hi2c->ErrorCode);
241 goto stop_task;
242 }
243 temp = aRxBuffer[0] << 8;
244 if(i2c_memread(hi2c, (uint16_t)ADT7410_ADDR, ADT7410_TEMP_L, I2C_MEMADD_SIZE_8BIT, (uint8_t*)aRxBuffer, 1)!= E_OK){
245 /* I2C RECEIVE ERROR */
246 syslog_1(LOG_ERROR, "## I2C ERROR(15)[%08x] ##", hi2c->ErrorCode);
247 goto stop_task;
248 }
249 temp += aRxBuffer[0];
250 temp /= 13;
251
252 get_tim(&tim);
253 set_time(&lcd_buf[0][0], tim);
254 LCD_locate(&CLcdHandle, 0, 0);
255 LCD_puts(&CLcdHandle, &lcd_buf[0][0]);
256 set_value(&lcd_buf[1][0], temp/10);
257 lcd_buf[1][2] = '.';
258 lcd_buf[1][3] = (temp % 10) + '0';
259 LCD_locate(&CLcdHandle, 0, 1);
260 LCD_puts(&CLcdHandle, &lcd_buf[1][0]);
261 if((count % 10) == 0)
262 syslog_2(LOG_NOTICE, "count(%d) temp(%d)", count, temp);
263 dly_tsk(1000);
264 count++;
265 }
266#endif
267
268stop_task:
269 syslog_0(LOG_NOTICE, "## STOP ##");
270 slp_tsk();
271 syslog(LOG_NOTICE, "Sample program ends.");
272// SVC_PERROR(ext_ker());
273}
Note: See TracBrowser for help on using the repository browser.