4 * \brief AD799x I2C ADCからデータを読み込み、API経由でアプリケーションへ渡す
8 #include <t_services.h>
9 #include <s_services.h>
10 #include <i2c_subsystem.h>
11 #include "kernel_id.h"
16 * @brief AD7999のチャンネル数
23 * 変換値を保存する。アクセスは排他的でなければならない。値は符号付き左詰めである。
24 * 整数部はないので、1ビットの符号の右に小数部が連なる。
26 static fract32 values[NUM_CH];
30 * AD7999が接続されているI2Cペリフェラルのポート番号。デフォルトは0である。他のポートを使いたい時には
31 * sys_config.hで宣言すると良い。なお、I2Cコントローラ・ペリフェラルがひとつしかない場合には0を指定
34 #ifndef UZUME_AD7999_I2C_PORT
35 #define UZUME_AD7999_I2C_PORT 0x00
40 * AD7999の7bit I2Cアドレスはデフォルトで0x28と決め打ちしている。他のアドレスを使いたい時には
41 * sys_config.hで宣言すると良い
43 #ifndef UZUME_AD7999_I2C_ADRS
44 #define UZUME_AD7999_I2C_ADRS 0x28
49 * \param extinf タスク引数。ADC799xが持つ7bitのI2Cアドレスを指定する。
51 void ad7999_task(VP_INT exinf)
54 unsigned char adcbuf[2];
59 i2ccall(i2c_master_read(UZUME_AD7999_I2C_PORT, UZUME_AD7999_I2C_ADRS, adcbuf, 2));
61 /* 上位バイトのbit 5:4 をチャンネル番号として受け取る */
62 ch = ( adcbuf[0] & 0x30 ) >> 4;
63 /*上位バイトのbit 3;0と下位バイトから12bitのADCデータを作る。そのデータを32bitに左詰めする */
66 syscall(wai_sem(AD7999_SEM));
67 values[ch] = ( (( adcbuf[0] & 0x0F )<<8 ) | adcbuf[1] ) << 19;
68 syscall(sig_sem(AD7999_SEM));
75 fract32 get_volume(unsigned int ch)
84 syscall(wai_sem(AD7999_SEM));
86 syscall(sig_sem(AD7999_SEM));
93 void set_volume(unsigned int ch, fract32 value)