| | 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 | |