Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Issue Date: 2013-09-25 This application note illustrates how NEC IR (38 KHz), RC 5, and RC 6 waveforms are generated by an Android device using Java D2XX with an FT-X chip working in Async bit-bang mode with minimum hardware cost. Also illustrates using Sync bit-bang mode to perform continuous reading. Use of FTDI devices in life support and/or safety applications is entirely at the user’s risk, and the user agrees to defend, indemnify and hold FTDI harmless from any and all damages, claims, suits or expense resulting from such use. Future Technology Devices International Limited (FTDI) Unit 1, 2 Seaward Place, Glasgow G41 1HH, United Kingdom Tel.: +44 (0) 141 429 2777 Fax: + 44 (0) 141 429 2758 Web Site: http://ftdichip.com Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 Table of Contents 1 2 3 4 5 6 Introduction .................................................................................................................................... 2 1.1 Overview ................................................................................................................................. 2 1.2 Scope ....................................................................................................................................... 2 Infra Red (IR) Data Protocols........................................................................................................... 3 2.1 NEC IR Protocol ....................................................................................................................... 3 2.2 Philips RC-5 IR Protocol ........................................................................................................... 3 2.3 Philips RC-6 IR Protocol ........................................................................................................... 4 Hardware Requirement .................................................................................................................. 5 3.1 Async BitBang Mode of FTDI Devices...................................................................................... 5 3.2 Sync BitBang Mode of FTDI Devices........................................................................................ 5 Example Circuit ............................................................................................................................... 6 4.1 Typical UART to IR block diagram ........................................................................................... 6 4.2 A minimum hardware cost IR block diagram .......................................................................... 6 4.3 Schematic ................................................................................................................................ 6 Example Program(writing) .............................................................................................................. 7 5.1 MainActivity.java .................................................................................................................... 7 5.2 SetAsyncBitBang.java .............................................................................................................. 8 Example application (reading) ...................................................................................................... 13 6.1 Sample application to drive the IR reader ............................................................................ 13 6.2 JAVA D2xx Sync BitBang Reader App .................................................................................... 14 7 Testing Results .............................................................................................................................. 18 8 Contact Information...................................................................................................................... 22 Appendix A – References ...................................................................................................................... 23 8.1 Document References........................................................................................................... 23 8.2 Acronyms and Abbreviations ................................................................................................ 23 Appendix B – List of Tables & Figures ................................................................................................... 24 8.3 List of Figures ........................................................................................................................ 24 Appendix C – Revision History .............................................................................................................. 25 Product Page Document Feedback 1 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 1 Introduction This application note illustrates how NEC IR (38 KHz), RC 5, and RC 6 waveforms are generated by an Android device using Java D2XX with an FT-X chip working in Async bit-bang mode with minimum hardware cost. Also illustrates using Sync bit-bang mode to perform continuous reading. 1.1 Overview This document is designed for engineers who want to design an IR module with simple SetBitMode, Read and Write commands for an Android system. 1.2 Scope NEC, Philip RC-5, and Philip RC-6 IR waveforms are described in following sections. Product Page Document Feedback 2 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 2 Infra Red (IR) Data Protocols Infra red data is typically serial data. It is encoded to different protocols that different vendors support. As an example such encoding is what allows a TV remote control to work with one TV but not another. 2.1 NEC IR Protocol NEC IR features are listed below 8 bit address and 8 bit command Address and command are transmitted twice Pulse distance modulation Carrier frequency is 38KHz Bit time is 1.125 ms (logical 0) or 2.25 ms (logical 1) NEC IR protocol is listed as following Figure 2.1 NEC IR Protocol NEC IR modulation Figure 2.2 NEC IR Modula NEC IR carrier Figure 2.3 NEC IR Carrier 2.2 Philips RC-5 IR Protocol Philips RC-5 IR features are listed below 5 bit address and 6 bit command All bits have an equal length of 1.778ms Bi-phase modulation (also called Manchester coding) Carrier frequency is 36KHz The duty cycle of carrier frequency is 25% to 33% Product Page Document Feedback 3 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 Figure 2.4 Philips RC-5 IR Protocol Figure 2.5 Philips RC-5 IR Modula Figure 2.6 Philips RC-5 IR Carrier 2.3 Philips RC-6 IR Protocol RC-6 signals are modulated on a 36 kHz carrier the same as RC-5. The duty cycle of this carrier has to be between 25% and 50%. Product Page Document Feedback 4 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 3 Hardware Requirement The following hardware is required to test the IR transmitter on an Android platform. An Android system with an OTG USB connector (Google Nexus 7 in this application note) An FTDI UMFT234XD module A NPN transistor (BC817 in this application note) An IR LED 1KΩ and 100Ω resistors 3.1 Async BitBang Mode of FTDI Devices Async BitBang Mode is able to set each pin independently as an input or an output. The data rate is controlled by the baud rate generator. New data is written when the baud rate clock ticks. If no new data is written to the device, the pins will hold the last written value. This application uses only the TXD pin to generate IR LED signal( eg. 4 bytes of data are needed to send a data stream 0101.). The clock for the BitBang mode is actually 16 times the baudrate. A value of 9600 baud would transfer the data at (9600 x 16) = 153600 bytes per second or once every 6.5 uS. Set the baud rate to 7102 to have 8.8 usec duty on cycle in this application note. 3.2 Sync BitBang Mode of FTDI Devices Synchronous Bit Bang mode, data will only be sent out if there is space in the device for data to be read from the pins. This Synchronous Bit Bang mode will read the data bus pins first, before it sends out the byte that has just been transmitted. It is therefore 1 byte behind the output and so to read the inputs for the byte that you have just sent, another byte must be sent.” (AN_232R-01) Sync Bit Bang mode is used for IR signals reading in this application. Set the baud rate to 625. The sample reate will be 1/(625*16) = 100us. The program will read IR signals every 100 us. It is fast enough to sample NEC IR signals since stop bit is 560us, Logic “0” is 1.12ms, and Logic “1” is 2.25ms. Product Page Document Feedback 5 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 4 Example Circuit 4.1 Typical UART to IR block diagram U2 U1 An Android system with an OTG USB connector (Google Nexus 7) FTDI USB OTG Connectoo r RXD TXD USB-to-UART chip ST3795 (FT234XD) FT230X) NEC IR OutputEnoder Encoder Figure 4.1 Typical USB-to-IR block diagram IR_TX IR LED Module A typical IR design will take UART information from an MCU (USB/UART bridge in this diagram) and buffer this data through a dedicated IR transmitter. 4.2 A minimum hardware cost IR block diagram U1 An Android system with an OTG USB connector USB OTG Connecto r (Google Nexus 7) FTDI USB-to-UART chip (FT234XD or other FT-X chips) TXD IR LED Module Figure 4.2 A minimum USB-to-IR block diagram Using an FTDI chip in bitbang mode whereby a data stream is bit banged out on a pin to the IR module removes the dedicated IR encoder. Encoding is done on the host tablet and bit banged on the FT234XD. 4.3 Schematic Figure 4.3 Schematic of IR LED module Product Page Document Feedback 6 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 5 Example Program(writing) MainActivity.java is the main program and SetAsyncBitBang.java does the mode setting to async bitbang mode. The button1 click event will call CleanTextView function. Figure 5.1 Java D2XX code overview Figure 5.2 Java D2XX code Running Result 5.1 MainActivity.java package com.example.nec.ir.xchips; import import import import import import import android.os.Bundle; android.app.Activity; android.content.pm.ActivityInfo; android.text.method.ScrollingMovementMethod; android.view.Menu; android.view.View; android.widget.TextView; public class MainActivity extends Activity { private SetAsyncBitBang MyAsyncBitBang = null; public byte[] NECIRAddress = new byte[8]; public byte[] NECIRCommand = new byte[8]; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); TextView MyMessage = (TextView) findViewById(R.id.RecvData); MyMessage.setMovementMethod(ScrollingMovementMethod.getInstance()); Product Page Document Feedback 7 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 IRSetBitMode(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void CleanTextView(View view) { TextView GetMyData = (TextView) findViewById(R.id.RecvData); GetMyData.setText(""); NECIRAddress[0]=0; NECIRAddress[1]=0; NECIRAddress[2]=0; NECIRAddress[3]=0; NECIRAddress[4]=0; NECIRAddress[5]=0; NECIRAddress[6]=0; NECIRAddress[7]=0; NECIRCommand[0]=1; NECIRCommand[1]=1; NECIRCommand[2]=0; NECIRCommand[3]=1; NECIRCommand[4]=1; NECIRCommand[5]=0; NECIRCommand[6]=1; NECIRCommand[7]=0; MyAsyncBitBang.Gen38KHzIR(NECIRAddress, NECIRCommand); } public void onMsgShow(final String recvdata){ runOnUiThread(new Runnable() { public void run() { TextView showstr = (TextView) findViewById(R.id.RecvData); showstr.append(recvdata); } }); } private void IRSetBitMode() { MyAsyncBitBang= new SetAsyncBitBang(this); } } 5.2 SetAsyncBitBang.java package com.example.nec.ir.xchips; import android.app.Activity; import android.content.IntentFilter; import android.hardware.usb.UsbManager; import com.ftdi.j2xx.D2xxManager; import com.ftdi.j2xx.FT_Device; public class SetAsyncBitBang { private Activity mContext; private D2xxManager ftD2xx = null; private FT_Device ftDevice = null; Product Page Document Feedback 8 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 private byte[] DataOutBuffer = new byte[7692]; public static final int NECIRHeaderLen= 341; private byte[] NECIRLeaderCode = new byte[3*NECIRHeaderLen]; Clearance No.: FTDI# 370 // 9ms/26.4us = 341 public static final int NECIRSpaceLen= 170; private byte[] NECIRSpace = new byte[3*NECIRSpaceLen]; 4.5m/26.4us = 170 // public static final int NECIROneLen= 85; private byte[] NECIROne = new byte[3*NECIROneLen]; 2.25m/26.4us = 85 // public static final int NECIRZeroLen= 42; private byte[] NECIRZero = new byte[3*NECIRZeroLen]; 1.12m/26.4us = 42 public static final int AddIdx =3*(NECIRHeaderLen+NECIRSpaceLen); // // 1533 public static final int CmdIdx =3*(NECIRHeaderLen+NECIRSpaceLen+8*(NECIROneLen+NECIRZeroLen)); // the index to point the command length 4581 public static final int NECIRStopLen= 21; private byte[] NECIRStopBit = new byte[3*NECIRStopLen]; 560u/26.4us = 21 public static final int StopIdx =3*(NECIRHeaderLen+NECIRSpaceLen+2*8*(NECIROneLen+NECIRZeroLen)); //7629 // public SetAsyncBitBang (Activity activity) { mContext = activity; try{ ftD2xx = D2xxManager.getInstance(mContext); }catch (D2xxManager.D2xxException ex) { LogInfo(ex.getMessage()); } IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); } public void LogInfo(String val) { ((MainActivity)mContext).onMsgShow(val+"\n"); } public boolean Gen38KHzIR(byte[] nECIRAddress, byte[] nECIRCommand) { int i; int j; int devCount = ftD2xx.createDeviceInfoList(mContext); int AddOffset=0; //The offset of Address int CmdOffset=0; //The offset of Command if(devCount > 0) { D2xxManager.FtDeviceInfoListNode[] deviceList = new D2xxManager.FtDeviceInfoListNode[devCount]; ftD2xx.getDeviceInfoList(devCount, deviceList); switch (deviceList[0].type) { case D2xxManager.FT_DEVICE_232B: LogInfo("Device Name : FT232B device"); break; case D2xxManager.FT_DEVICE_8U232AM: LogInfo("Device Name : FT8U232AM device"); break; case D2xxManager.FT_DEVICE_UNKNOWN: LogInfo("Device Name : Unknown device"); break; Product Page Document Feedback 9 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 case D2xxManager.FT_DEVICE_2232: LogInfo("Device Name : FT2232 device"); break; case D2xxManager.FT_DEVICE_232R: LogInfo("Device Name : FT232R device"); break; case D2xxManager.FT_DEVICE_2232H: LogInfo("Device Name : FT2232H device"); break; case D2xxManager.FT_DEVICE_4232H: LogInfo("Device Name : FT4232H device"); break; case D2xxManager.FT_DEVICE_232H: LogInfo("Device Name : FT232H device"); break; case D2xxManager.FT_DEVICE_X_SERIES: LogInfo("Device Name : FTDI X_SERIES"); break; default: LogInfo("Device Name : FT232B device"); break; } ftDevice = ftD2xx.openByIndex(mContext, 0); if(null == ftDevice) { LogInfo("ftDevice = null"); return false; } // ****************** // configure our port , Set to ASYNC BIT MODE if (!ftDevice.setBitMode((byte) 0xFF, D2xxManager.FT_BITMODE_ASYNC_BITBANG)) LogInfo("Set to ASYNC bitbang failed"); // **************** Configure Baud rate //** Reference AN232BM-01 to set the baud rate //** To have 8.8us baud rate in my case //** 9600 x 16 = 153600 //** 1/153600 = 6.5us //** So 1/113636.36 = 8.8us //** 113636.36 / 16 = 7102.27 if(!ftDevice.setBaudRate(7102)) LogInfo("Set bit rate failed"); //8.8us //****************** //****** Header ******* for (i=0;i<NECIRHeaderLen;i++) { NECIRLeaderCode[3*i]= (byte) 0xFF; NECIRLeaderCode[3*i+1]= (byte) 0x0; NECIRLeaderCode[3*i+2]= (byte) 0x0; } //****** Space *************** for (i=0;i<NECIRSpaceLen;i++) { NECIRSpace[3*i]= NECIRSpace[3*i+1] =NECIRSpace[3*i+2]=0; } //********NECIROne******** for (i=0;i<21;i++) { NECIROne[3*i]= (byte) 0xFF; NECIROne[3*i+1]= (byte) 0x0; NECIROne[3*i+2]= (byte) 0x0; } Product Page Document Feedback 10 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 for (i=22;i< NECIROneLen; i++) { NECIROne[3*i]=NECIROne[3*i+1]=NECIROne[3*i+2]=0; } //********NECIRZero******** for (i=0;i<21;i++) { NECIRZero[3*i]= (byte) 0xFF; NECIRZero[3*i+1]= (byte) 0x0; NECIRZero[3*i+2]= (byte) 0x0; } for (i=22;i< NECIRZeroLen; i++) { NECIRZero[3*i]=NECIRZero[3*i+1]=NECIRZero[3*i+2]=0; } //********NECIR Stop bit******** for (i=0;i<21;i++) { NECIRStopBit[3*i]= (byte) 0xFF; NECIRStopBit[3*i+1]= (byte) 0x0; NECIRStopBit[3*i+2]= (byte) 0x0; } // *** fill up the IR Leader Code for (i=0;i<3*NECIRHeaderLen;i++) { DataOutBuffer[i]= NECIRLeaderCode[i]; } // *** fill up the NEC IR Space for (i=0;i<3*NECIRSpaceLen;i++) { DataOutBuffer[(3*NECIRHeaderLen)+i]= NECIRSpace[i]; } //**** NEC IR Address ***** for (j=0; j<8; j++) { // 8 bit of NECIRAddress; put Address if (nECIRAddress[j]==0) // nECIRAddress[j]==0 { for (i=0;i<NECIRZeroLen*3; i++) { DataOutBuffer[AddIdx+AddOffset]=NECIRZero[i]; AddOffset++; } } else { for (i=0;i<NECIROneLen*3; i++) { DataOutBuffer[AddIdx+AddOffset]=NECIROne[i]; AddOffset++; } } } // **** NEC IR Address Bar for (j=0; j<8; j++) { // 8 bit of NECIRAddress; put Address Bar if (nECIRAddress[j]!=0) // nECIRAddress[j]!=0 Address Bar { for (i=0;i<NECIRZeroLen*3; i++) { DataOutBuffer[AddIdx+AddOffset]=NECIRZero[i]; AddOffset++; } } else { for (i=0;i<NECIROneLen*3; i++) { Product Page Document Feedback 11 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 DataOutBuffer[AddIdx+AddOffset]=NECIROne[i]; AddOffset++; } } } //**** End of NEC IR Address ***** CmdOffset=0; //**** NEC IR Command ***** for (j=0; j<8; j++) { // 8 bit of NECIRAddress; put Address if (nECIRCommand[j]==0) // nECIRAddress[j]==0 { for (i=0;i<NECIRZeroLen*3; i++) { DataOutBuffer[CmdIdx+CmdOffset]=NECIRZero[i]; CmdOffset++; } } else { for (i=0;i<NECIROneLen*3; i++) { DataOutBuffer[CmdIdx+CmdOffset]=NECIROne[i]; CmdOffset++; } } } // **** NEC IR Command Bar for (j=0; j<8; j++) { // 8 bit of NECIRAddress; put Address Bar if (nECIRCommand[j]!=0) // nECIRAddress[j]!=0 Address Bar { for (i=0;i<NECIRZeroLen*3; i++) { DataOutBuffer[CmdIdx+CmdOffset]=NECIRZero[i]; CmdOffset++; } } else { for (i=0;i<NECIROneLen*3; i++) { DataOutBuffer[CmdIdx+CmdOffset]=NECIROne[i]; CmdOffset++; } } } //**** End of NEC IR Command ***** //********** NEC IR Stop bit ******* for (i=0; i < 3*NECIRStopLen; i++) DataOutBuffer[StopIdx+i]= NECIRStopBit[i]; for (i=0; i<1; i++) { ftDevice.write(DataOutBuffer, 7692); } ftDevice.close(); return true; } return false; } } Product Page Document Feedback 12 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 6 Example application (reading) To test the IR reader a sample waveform was generated from a PC application driving the IR output (section 6.1). This is then used to drive the IR reader being run on the Android platform. PC FT234XD FT234XD ANDROID SYNC BITBANG RECEIVER ASYNC BITBANG TRANSMITTER Figure 6.1 IR Reader Test Setup 6.1 Sample application to drive the IR reader The following Visual C++ program is able to generate different Baud Rates MyAsyncBitBang.cpp A Visual C++ application to test the carrier waveform // MyAsyncBitBang.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> #include "FTD2XX.h" #include <stdlib.h> #include <stdio.h> #include <conio.h> #define REPEAT 18020 FT_STATUS ftStatus; DWORD dwNumBytesToSend = 0; //Index of output buffer DWORD dwNumBytesSent = 0, dwNumBytesRead = 0, dwNumInputBuffer = 0; BYTE ByteDataRead; WORD i=0; int j; BYTE DataOutBuffer[REPEAT]; BYTE InputBuffer[1024]; // int BAUDRATE=7102; int BAUDRATE=6793; // 8.8 usec // 9.2u usec BOOL Bitbang_Initial(FT_HANDLE ftHandle) { ftStatus |= FT_SetLatencyTimer(ftHandle, 2); ftStatus |= FT_SetBitMode(ftHandle, 0x0, 0x00); ftStatus |= FT_SetBitMode(ftHandle, 0xff, 0x01); //Set the latency timer //Reset controller //Enable Async Bitbang mode ftStatus |= FT_SetBaudRate(ftHandle, BAUDRATE); if (ftStatus != FT_OK) { printf("fail on initialize Async Bit-bang mode ! \n"); return false; } printf("Async Bitbang mode initial successful\n"); Product Page Document Feedback 13 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 return true; } int _tmain(int argc, _TCHAR* argv[]) { int i,j; FT_HANDLE ftdiHandle; ftStatus = FT_Open(0,&ftdiHandle); if(Bitbang_Initial(ftdiHandle) == TRUE) { for (j=0;j<6000; j++) { // Out 27.6 usec with 9.2usec duty cycle DataOutBuffer[3*j] = 0xff; // out 9.2usec high DataOutBuffer[3*j+1] = 0x00; // output (27.6-9.2) usec low DataOutBuffer[3*j+2] = 0x00; // output (27.6-9.2) usec low } for (j=0; j<1000; j++) { ftStatus = FT_Write(ftdiHandle,DataOutBuffer, 18000, &dwNumBytesSent); } } printf("Exit the loop now.\n"); FT_Close(ftdiHandle); printf("Closed the file handle.\n"); getch(); return 0; } 6.2 JAVA D2xx Sync BitBang Reader App An example to read IR signals continually on bit 0 of FT-X chip. Again MainActivity.java is the main application while syncbitbang.java controls the bitbang interface for reading the data. MainActivity.java package com.example.syncbitbang4ir; import com.ftdi.j2xx.D2xxManager; import com.ftdi.j2xx.FT_Device; import android.app.Activity; import android.content.IntentFilter; import android.hardware.usb.UsbManager; public class SyncBitBang { CompareThread compareThread; private Activity mContext; private D2xxManager ftD2xx = null; private FT_Device ftDevice = null; public static final int TwoK= 2*1024; private byte[] DataOutBuffer = new byte[TwoK]; private byte[] DataInBuffer = new byte[TwoK]; public SyncBitBang (Activity activity) { Product Page Document Feedback // get data to this buffer 14 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 mContext = activity; try{ ftD2xx = D2xxManager.getInstance(mContext); }catch (D2xxManager.D2xxException ex) { LogInfo(ex.getMessage()); } IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); } public void LogInfo(String val) { ((MainActivity)mContext).onMsgShow(val+"\n"); } public boolean Gen128KHzIR() { int devCount = ftD2xx.createDeviceInfoList(mContext); // LogInfo("Inside of Gen128KHzIR function..."); if(devCount > 0) { D2xxManager.FtDeviceInfoListNode[] deviceList = new D2xxManager.FtDeviceInfoListNode[devCount]; ftD2xx.getDeviceInfoList(devCount, deviceList); //*** send data and loop back**** // **************** Configure Baud rate //** Reference AN232BM-01 to set the baud rate //** To have 8.8us baud rate in my case //** 9600 x 16 = 153600 //** 1/153600 = 6.5us //** So 8.8us = 1/113636.36 //** 100 us = 1/(625*16) // if(!ftDevice.setBaudRate(8000)) //128Khz if(!ftDevice.setBaudRate(625)) //10kHz LogInfo("Set bit rate failed"); //****************** if(!ftDevice.setLatencyTimer((byte) 2)); //Set Latency time to 2ms LogInfo("Set latency time failed"); //****************** // Reset if (!ftDevice.setBitMode((byte) 0xFE, D2xxManager.FT_BITMODE_RESET)) LogInfo("Reset failed"); // Sync Write also read back // configure our port , Set to SYNC BIT MODE if (!ftDevice.setBitMode((byte) 0xFE, D2xxManager.FT_BITMODE_SYNC_BITBANG)) // bit 0 input, bit 1~7 output LogInfo("Set to SYNC bitbang failed"); else LogInfo("SYNC bitbang going..."); compareThread = new CompareThread(); compareThread.start(); return true; } return false; } class CompareThread extends Thread { public void run() { int i; ftDevice.write(DataOutBuffer, 256); Product Page Document Feedback // Sync write 256 bytes 15 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 for (i=0;i<5000; i++) { ftDevice.write(DataOutBuffer, 256); ftDevice.read(DataInBuffer, 256); // Sync another 256 bytes // Sync read 256 bytes } ftDevice.close(); } } } SyncBitBang.java package com.example.syncbitbang4ir; import com.ftdi.j2xx.D2xxManager; import com.ftdi.j2xx.FT_Device; import android.app.Activity; import android.content.IntentFilter; import android.hardware.usb.UsbManager; public class SyncBitBang { CompareThread compareThread; private Activity mContext; private D2xxManager ftD2xx = null; private FT_Device ftDevice = null; public static final int TwoK= 2*1024; private byte[] DataOutBuffer = new byte[TwoK]; private byte[] DataInBuffer = new byte[TwoK]; // get data to this buffer public SyncBitBang (Activity activity) { mContext = activity; try{ ftD2xx = D2xxManager.getInstance(mContext); }catch (D2xxManager.D2xxException ex) { LogInfo(ex.getMessage()); } IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); } public void LogInfo(String val) { ((MainActivity)mContext).onMsgShow(val+"\n"); } public boolean Gen128KHzIR() { int devCount = ftD2xx.createDeviceInfoList(mContext); // LogInfo("Inside of Gen128KHzIR function..."); if(devCount > 0) { D2xxManager.FtDeviceInfoListNode[] deviceList = new D2xxManager.FtDeviceInfoListNode[devCount]; ftD2xx.getDeviceInfoList(devCount, deviceList); //*** send data and loop back**** // **************** Configure Baud rate //** Reference AN232BM-01 to set the baud rate //** To have 8.8us baud rate in my case //** 9600 x 16 = 153600 //** 1/153600 = 6.5us //** So 8.8us = 1/113636.36 //** 100 us = 1/(625*16) // if(!ftDevice.setBaudRate(8000)) //128Khz if(!ftDevice.setBaudRate(625)) //10kHz Product Page Document Feedback 16 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 LogInfo("Set bit rate failed"); //****************** if(!ftDevice.setLatencyTimer((byte) 2)); //Set Latency time to 2ms LogInfo("Set latency time failed"); //****************** // Reset if (!ftDevice.setBitMode((byte) 0xFE, D2xxManager.FT_BITMODE_RESET)) LogInfo("Reset failed"); // Sync Write also read back // configure our port , Set to SYNC BIT MODE if (!ftDevice.setBitMode((byte) 0xFE, D2xxManager.FT_BITMODE_SYNC_BITBANG)) // bit 0 input, bit 1~7 output LogInfo("Set to SYNC bitbang failed"); else LogInfo("SYNC bitbang going..."); compareThread = new CompareThread(); compareThread.start(); return true; } return false; } class CompareThread extends Thread { public void run() { int i; ftDevice.write(DataOutBuffer, 256); // Sync write 256 bytes for (i=0;i<5000; i++) { ftDevice.write(DataOutBuffer, 256); ftDevice.read(DataInBuffer, 256); // Sync another 256 bytes // Sync read 256 bytes } ftDevice.close(); } } } Product Page Document Feedback 17 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 7 Testing Results Figure 7.1 Measure the IR LED to GND Address = 0000_0000 (LSB to MSB); Address Bar = 1111_1111 (LSB to MSB) Command = 1101_1010 (LSB to MSB); Command Bar = 0010_0101 (LSB to MSB) Figure 7.2 Measure FT234XD TXD pin to GND Product Page Document Feedback 18 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 Figure 7.3 Measure the IR receiver Figure 7.4 27.6usec for Philips RC-5/ RC-6 carrier (Generated by MyAsyncBitBang.cpp) Product Page Document Feedback 19 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 Figure 7.5 9.2usec duty cycle for Philips RC-5/ RC-6 carrier (Generated by MyAsyncBitBang.cpp) Figure 7.6 Set BitBang_WR# on C0 and BitBang_RD# on C1 for a FT-X chip Product Page Document Feedback 20 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 Figure 7.7 Generate 100 us wavefrom on C1 BitBang_RD# Product Page Document Feedback 21 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 8 Contact Information Head Office – Glasgow, UK Branch Office – Tigard, Oregon, USA Future Technology Devices International Limited Unit 1, 2 Seaward Place, Centurion Business Park Glasgow G41 1HH United Kingdom Tel: +44 (0) 141 429 2777 Fax: +44 (0) 141 429 2758 Future Technology Devices International Limited (USA) 7130 SW Fir Loop Tigard, OR 97223-8160 USA Tel: +1 (503) 547 0988 Fax: +1 (503) 547 0987 E-mail (Sales) E-mail (Support) E-mail (General Enquiries) [email protected] [email protected] [email protected] E-Mail (Sales) E-Mail (Support) E-Mail (General Enquiries) [email protected] [email protected] [email protected] Branch Office – Taipei, Taiwan Branch Office – Shanghai, China Future Technology Devices International Limited (Taiwan) 2F, No. 516, Sec. 1, NeiHu Road Taipei 114 Taiwan , R.O.C. Tel: +886 (0) 2 8797 1330 Fax: +886 (0) 2 8751 9737 Future Technology Devices International Limited (China) Room 1103, No. 666 West Huaihai Road, Shanghai, 200052 China Tel: +86 21 62351596 Fax: +86 21 62351595 E-mail (Sales) E-mail (Support) E-mail (General Enquiries) E-mail (Sales) E-mail (Support) E-mail (General Enquiries) [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] Web Site http://ftdichip.com System and equipment manufacturers and designers are responsible to ensure that their systems, and any Future Technology Devices International Ltd (FTDI) devices incorporated in their systems, meet all applicable safety, regulatory and system-level performance requirements. All application-related information in this document (including application descriptions, suggested FTDI devices and other materials) is provided for reference only. While FTDI has taken care to assure it is accurate, this information is subject to customer confirmation, and FTDI disclaims all liability for system designs and for any applications assistance provided by FTDI. Use of FTDI devices in life support and/or safety applications is entirely at the user’s risk, and the user agrees to defend, indemnify and hold harmless FTDI from any and all damages, claims, suits or expense resulting from such use. This document is subject to change without notice. No freedom to use patents or other intellectual property rights is implied by the publication of this document. Neither the whole nor any part of the information contained in, or the product described in this document, may be adapted or reproduced in any material or electronic form without the prior written consent of the copyright holder. Future Technology Devices International Ltd, Unit 1, 2 Seaward Place, Centurion Business Park, Glasgow G41 1HH, United Kingdom. Scotland Registered Company Number: SC136640 Product Page Document Feedback 22 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 Appendix A – References 8.1 Document References AN_232R-01 for the FT232R and FT245R Bit Bang Modes AN_233 Java D2xx for Android API User Manual 8.2 Acronyms and Abbreviations Terms IR Description Infrared LED Light Emitting Diodes OTG USB On-The-Go USB Universal Serial Bus Product Page Document Feedback 23 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 Appendix B – List of Tables & Figures 8.3 List of Figures Figure 2.1 NEC IR Protocol ................................................................................................... 3 Figure 2.2 NEC IR Modula ................................................................................................... 3 Figure 2.3 NEC IR Carrier .................................................................................................... 3 Figure 2.4 Philips RC-5 IR Protocol ........................................................................................ 4 Figure 2.5 Philips RC-5 IR Modula ........................................................................................ 4 Figure 2.6 Philips RC-5 IR Carrier ......................................................................................... 4 Figure 4.1 Typical USB-to-IR block diagram ........................................................................... 6 Figure 4.2 A minimum USB-to-IR block diagram ..................................................................... 6 Figure 4.3 Schematic of IR LED module ................................................................................. 6 Figure 5.1 Java D2XX code overview .................................................................................... 7 Figure 5.2 Java D2XX code Running Result ............................................................................ 7 Figure 6.1 IR Reader Test Setup ......................................................................................... 13 Figure 7.1 Measure the IR LED to GND ................................................................................ 18 Figure 7.2 Measure FT234XD TXD pin to GND ....................................................................... 18 Figure 7.3 Measure the IR receiver ...................................................................................... 19 Figure 7.4 27.6usec for Philips RC-5/ RC-6 carrier (Generated by MyAsyncBitBang.cpp) ............ 19 Figure 7.5 9.2usec duty cycle for Philips RC-5/ RC-6 carrier (Generated by MyAsyncBitBang.cpp) 20 Figure 7.6 Set BitBang_WR# on C0 and BitBang_RD# on C1 for a FT-X chip ............................ 20 Figure 7.7 Generate 100 us wavefrom on C1 BitBang_RD# .................................................... 21 Product Page Document Feedback 24 Copyright © 2014 Future Technology Devices International Limited Application Note AN_260 IR Remote Control Implementation by Java D2XX Version 1.0 Document Reference No.: FT_000901 Clearance No.: FTDI# 370 Appendix C – Revision History Document Title: AN_260 IR Remote Control Implementation by Java D2XX Document Reference No.: FT_000901 Clearance No.: FTDI# 370 Product Page: http://www.ftdichip.com/FTProducts.htm Document Feedback: Send Feedback Revision 1.0 Product Page Document Feedback Changes Initial Release Date 2014-02-17 25 Copyright © 2014 Future Technology Devices International Limited