| 361 | |
| 362 | == IOC == |
| 363 | |
| 364 | 接続方法と使用するコマンドがわかったので、IOCを作成する。[[br]] |
| 365 | 作成するレコードは、ADT7410のADCを16bitに設定するコマンドと、温度を取得するコマンドのみ。[[br]] |
| 366 | 以前作った、[wiki:/epics/bbb/debian/USBHID/USB_SP4T drvAsynUSBHID]を使って、コマンドを実装。[[br]] |
| 367 | |
| 368 | ここで気付いたのだが、drvAsynUSBHIDはInput,Outputを使った制御には使えるが、USBHIDデバイス自体を制御するFeatureコマンドには対応していない。[[br]] |
| 369 | 今回もFeatureコマンドを使わなくても目的は達成できたが、今後Featureコマンドが必須の制御をする場合には、何らかの解決策を考える必要がありそう。[[br]] |
| 370 | |
| 371 | === 使用コマンド(FT260) === |
| 372 | |
| 373 | 今回使用するFT260上のコマンドは、 |
| 374 | |
| 375 | * I2C Write Request(0xD0~0xDE) |
| 376 | * I2C Read Request(0xC2) |
| 377 | * I2C Input Report(0xD0~0xDE) |
| 378 | |
| 379 | のみである。I2C Input ReportはReadで返ってくるフォーマットの定義なので、I2C Write RequestとI2C Read Requestだけを実装する。 |
| 380 | |
| 381 | === protocol ファイル === |
| 382 | |
| 383 | 今回作成したプロトコルファイルがこれ。 |
| 384 | |
| 385 | {{{ |
| 386 | TERMINATOR=""; |
| 387 | LockTimeout = 500; |
| 388 | ReplyTimeout = 100; |
| 389 | ReadTimeout = 100; |
| 390 | WriteTimeout = 100; |
| 391 | MaxInput=8; |
| 392 | |
| 393 | wr_4 = 0xD0; |
| 394 | rd = 0xC2; |
| 395 | flg = 0x06; |
| 396 | len = 0x04; |
| 397 | |
| 398 | ##################### |
| 399 | # $1:I2C slave device addr |
| 400 | ##################### |
| 401 | |
| 402 | # Set ADT7410 ADC Resolution(16bit) |
| 403 | setADCRes { |
| 404 | out $wr_4 $1 $flg 0x02 0x03 0x80 0x00 0x00; |
| 405 | } |
| 406 | |
| 407 | # Read ADT7410 templature value |
| 408 | getTemp { |
| 409 | out $rd $1 $flg $len 0x00; |
| 410 | in $wr_4 $len "%(\$2)01r" "%01r" "%*4r"; |
| 411 | } |
| 412 | |
| 413 | }}} |
| 414 | |
| 415 | I2Cデバイスのアドレスをdbファイルから設定できるようにして、温度レジスタを別々に読み込んでCALCで計算するようにした。[[br]] |
| 416 | |
| 417 | === DBファイル === |
| 418 | |
| 419 | {{{ |
| 420 | record(bo, "$(user):ADT7410:init") |
| 421 | { |
| 422 | field(DESC, "Set ADT7410 ADC 16bit") |
| 423 | field(DTYP, "stream") |
| 424 | field(OUT, "@FT260_ADT7410.proto setADCRes($(i2caddr)) $(dev)") |
| 425 | } |
| 426 | |
| 427 | record(longin, "$(user):temp:reg:HSB") |
| 428 | { |
| 429 | field(DESC, "Get temperature registor HSB") |
| 430 | } |
| 431 | |
| 432 | record(longin, "$(user):temp:reg:LSB") |
| 433 | { |
| 434 | field(DESC, "Get temperature registor LSB") |
| 435 | field(DTYP, "stream") |
| 436 | field(INP, "@FT260_ADT7410.proto getTemp($(i2caddr),$(user):temp:reg:HSB) $(dev)") |
| 437 | field(SCAN, "$(scan)") |
| 438 | field(FLNK, "$(user):temp") |
| 439 | } |
| 440 | |
| 441 | |
| 442 | record(calc, "$(user):temp") |
| 443 | { |
| 444 | field(DESC, "Get temperature") |
| 445 | field(INPA, "$(user):temp:reg:LSB") |
| 446 | field(INPB, "$(user):temp:reg:HSB") |
| 447 | field(CALC, "(B&0x80)=0x80?(((B<<8)|A)-65536)/128:((B<<8)|A)/128") |
| 448 | field(PREC, "5") |
| 449 | field(EGU, "degC") |
| 450 | } |
| 451 | }}} |
| 452 | |
| 453 | |
| 454 | |