source: azure_iot_hub_f767zi/trunk/asp_baseplatform/OBJ/STM32F767NUCLEO144_GCC/i2cshield/i2ctest.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: 8.5 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 */
47
48#include <kernel.h>
49#include <t_syslog.h>
50#include <t_stdlib.h>
51#include <sil.h>
52#include <string.h>
53#include "syssvc/serial.h"
54#include "syssvc/syslog.h"
55#include "kernel_cfg.h"
56#include <target_syssvc.h>
57#include "device.h"
58#include "i2ctest.h"
59
60/*
61 * サービスコールのエラーのログ出力
62 */
63Inline void
64svc_perror(const char *file, int_t line, const char *expr, ER ercd)
65{
66 if (ercd < 0) {
67 t_perror(LOG_ERROR, file, line, expr, ercd);
68 }
69}
70
71#define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
72
73
74#define RXBUFFERSIZE 8
75
76#define LCD_ADDR (0x3E<<1)
77#define EEPROM_ADDR (0x50<<1)
78#define ADT7410_ADDR (0x48<<1)
79
80#define ADT7410_TEMP_H 0x00
81#define ADT7410_TEMP_L 0x01
82#define ADT7410_STATUS 0x02
83
84#define LCD_locate(h, x, y) aqm0802_set_command((h), (0x80 + ((y) << 6) + (x)))
85#define LCD_puts(h, b) aqm0802_set_data((h), (b), strlen((const char *)(b)))
86
87
88/* Buffer used for reception */
89uint8_t aRxBuffer[RXBUFFERSIZE];
90uint8_t aRxBuffer2[RXBUFFERSIZE];
91
92uint8_t lcd_buf[2][12];
93
94/*
95 * SW1割込み
96 */
97void sw_int(void)
98{
99 syslog_0(LOG_NOTICE, "## sw_int() ##");
100}
101
102/*
103 * I2C SEND CALLBACK FUNCTION
104 */
105static void
106I2C_TxCpltCallback(I2C_Handle_t *hi2c)
107{
108 syslog_1(LOG_INFO, "## I2C_TxCpltCallback(%08x) ##", hi2c);
109}
110
111/*
112 * I2C RECEIVE CALLBACK
113 */
114static void
115I2C_RxCpltCallback(I2C_Handle_t *hi2c)
116{
117 syslog_1(LOG_INFO, "## I2C_RxCpltCallback(%08x) ##", hi2c);
118}
119
120/*
121 * I2C ERROR CALLBACK
122 */
123static void
124I2C_ErrorCallback(I2C_Handle_t *hi2c)
125{
126 syslog_1(LOG_ERROR, "## I2C_ErrorCallback(%08x) ##", hi2c);
127}
128
129static void
130set_value(uint8_t *buf, int value)
131{
132 buf[1] = (value % 10) + '0';
133 buf[0] = (value / 10) + '0';
134}
135
136static void
137set_time(uint8_t *buf, long time)
138{
139 struct tm2 timedate;
140
141 rtc_get_time(&timedate);
142 set_value(&buf[6], timedate.tm_sec);
143 buf[5] = ':';
144 set_value(&buf[3], timedate.tm_min);
145 buf[2] = ':';
146 set_value(&buf[0], timedate.tm_hour);
147}
148
149/*
150 * メインタスク
151 */
152void main_task(intptr_t exinf)
153{
154 I2C_Init_t i2c_initd;
155 I2C_Handle_t *hi2c;
156 CLCD_Handler_t CLcdHandle;
157 ER_UINT ercd;
158 SYSTIM tim;
159 uint32_t temp;
160 uint32_t count = 0;
161
162 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
163 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
164
165 /*
166 * シリアルポートの初期化
167 *
168 * システムログタスクと同じシリアルポートを使う場合など,シリアル
169 * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
170 * ない.
171 */
172 ercd = serial_opn_por(TASK_PORTID);
173 if (ercd < 0 && MERCD(ercd) != E_OBJ) {
174 syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
175 itron_strerror(ercd), SERCD(ercd));
176 }
177 SVC_PERROR(serial_ctl_por(TASK_PORTID,
178 (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
179
180 syslog_0(LOG_NOTICE, "I2C SEND/RECV START");
181
182 i2c_initd.Timing = 0x00D00E28;
183 i2c_initd.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
184 i2c_initd.DualAddressMode = I2C_DUALADDRESS_DISABLE;
185 i2c_initd.GeneralCallMode = I2C_GENERALCALL_DISABLE;
186 i2c_initd.NoStretchMode = I2C_NOSTRETCH_DISABLE;
187 i2c_initd.OwnAddress1 = 0;
188 i2c_initd.OwnAddress2 = 0;
189 i2c_initd.semid = I2CTRS_SEM;
190 i2c_initd.semlock = I2CLOC_SEM;
191
192 if((hi2c = i2c_init(I2C_PORTID, &i2c_initd)) == NULL){
193 /* Initialization Error */
194 syslog_0(LOG_ERROR, "## I2C ERROR(1) ##");
195 }
196 syslog_0(LOG_NOTICE, "LCD INITAILIZE !");
197
198 hi2c->writecallback = I2C_TxCpltCallback;
199 hi2c->readcallback = I2C_RxCpltCallback;
200 hi2c->errorcallback = I2C_ErrorCallback;
201
202 memset(&lcd_buf[0][0], ' ', 8);
203 memset(&lcd_buf[1][0], ' ', 8);
204
205 CLcdHandle.hi2c = hi2c;
206 CLcdHandle.saddr = LCD_ADDR;
207 if((ercd = aqm0802_init(&CLcdHandle)) != E_OK){
208 syslog_2(LOG_ERROR, "## LCD INIT ERROR(%d)[%08x] ##", ercd, hi2c->ErrorCode);
209 goto stop_task;
210 }
211
212 get_tim(&tim);
213 set_time(&lcd_buf[0][0], tim);
214 LCD_locate(&CLcdHandle, 0, 0);
215 LCD_puts(&CLcdHandle, &lcd_buf[0][0]);
216
217#ifdef EEPROM_ADDR
218 syslog_1(LOG_NOTICE, "READ EEPROM [%08x] !", aRxBuffer2);
219 if(i2c_memread(hi2c, (uint16_t)EEPROM_ADDR, 0, I2C_MEMADD_SIZE_16BIT, (uint8_t*)aRxBuffer2, RXBUFFERSIZE, 500)!= E_OK){
220 /* I2C RECEIVE ERROR */
221 syslog_1(LOG_ERROR, "## I2C ERROR(12)[%08x] ##", hi2c->ErrorCode);
222 goto stop_task;
223 }
224#endif
225
226 syslog_0(LOG_NOTICE, "TEMP SENSER !");
227 do{
228 /* STATUS READ */
229 if(i2c_memread(hi2c, (uint16_t)ADT7410_ADDR, ADT7410_STATUS, I2C_MEMADD_SIZE_8BIT, (uint8_t*)aRxBuffer, 1, 500)!= E_OK){
230 /* I2C RECEIVE ERROR */
231 syslog_1(LOG_ERROR, "## I2C ERROR(13)[%08x] ##", hi2c->ErrorCode);
232 goto stop_task;
233 }
234 temp = aRxBuffer[0];
235 }while((temp & 0x80) != 0);
236
237 while(count < 1000){
238 if(i2c_memread(hi2c, (uint16_t)ADT7410_ADDR, ADT7410_TEMP_H, I2C_MEMADD_SIZE_8BIT, (uint8_t*)aRxBuffer, 1, 500)!= 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, 500)!= 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
267stop_task:
268 syslog_0(LOG_NOTICE, "## STOP ##");
269 slp_tsk();
270 syslog(LOG_NOTICE, "Sample program ends.");
271// SVC_PERROR(ext_ker());
272}
Note: See TracBrowser for help on using the repository browser.