/* | |
* Edited by Robert Woodruff 2021 | |
* From the USBFTDILoopback.ino example provided with the USB Host Shield 2.0 library | |
* https://github.com/felis/USB_Host_Shield_2.0 | |
* Released under GNU General Public License | |
* | |
* This example will check the UART receive buffer once every program loop | |
* If data is available, one byte will be read in and sent to the MAX3421E | |
* | |
* The MAX3421E USB receive buffer will be checked once every program loop | |
* If data is available, 0 - 62 bytes will be retrieved and sent over UART | |
*/ | |
#include <cdcftdi.h> | |
#include <usbhub.h> | |
#include "pgmstrings.h" | |
// Satisfy the IDE, which needs to see the include statment in the ino too. | |
#ifdef dobogusinclude | |
#include <spi4teensy3.h> | |
#endif | |
#include <SPI.h> | |
class FTDIAsync : public FTDIAsyncOper | |
{ | |
public: | |
uint8_t OnInit(FTDI *pftdi); | |
}; | |
uint8_t FTDIAsync::OnInit(FTDI *pftdi) | |
{ | |
uint8_t rcode = 0; | |
rcode = pftdi->SetBaudRate(115200); | |
if (rcode) | |
{ | |
ErrorMessage<uint8_t>(PSTR("SetBaudRate"), rcode); | |
return rcode; | |
} | |
rcode = pftdi->SetFlowControl(FTDI_SIO_DISABLE_FLOW_CTRL); | |
if (rcode) | |
ErrorMessage<uint8_t>(PSTR("SetFlowControl"), rcode); | |
return rcode; | |
} | |
USB Usb; | |
//USBHub Hub(&Usb); | |
FTDIAsync FtdiAsync; | |
FTDI Ftdi(&Usb, &FtdiAsync); | |
void setup() | |
{ | |
Serial.begin( 115200 ); | |
#if !defined(__MIPSEL__) | |
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection | |
#endif | |
Serial.println("Start"); | |
if (Usb.Init() == -1) | |
Serial.println("OSC did not start."); | |
delay( 200 ); | |
} | |
void loop() | |
{ | |
Usb.Task(); | |
if( Usb.getUsbTaskState() == USB_STATE_RUNNING ) | |
{ | |
uint8_t rcode; | |
char strbuf[2] = ""; | |
if (Serial.available()) | |
{ | |
// Read character from UART buffer | |
strbuf[0] = Serial.read(); | |
// Echo character to terminal | |
Serial.print(strbuf[0]); | |
// Add LF after a CR | |
if (strbuf[0] == '\r') { | |
Serial.print('\n'); | |
} | |
rcode = Ftdi.SndData(strlen(strbuf), (uint8_t*)strbuf); | |
if (rcode) | |
ErrorMessage<uint8_t>(PSTR("SndData"), rcode); | |
// delay(50); | |
} | |
uint8_t buf[64]; | |
for (uint8_t i=0; i<64; i++) | |
buf[i] = 0; | |
uint16_t rcvd = 64; | |
rcode = Ftdi.RcvData(&rcvd, buf); | |
if (rcode && rcode != hrNAK) | |
ErrorMessage<uint8_t>(PSTR("Ret"), rcode); | |
// The device reserves the first two bytes of data | |
// to contain the current values of the modem and line status registers. | |
if (rcvd > 2) | |
{ | |
// Print buffer at once | |
// Serial.print((char*)(buf+2)); | |
// Print buffer characters individually | |
for (uint8_t i = 2; i < rcvd; i++) | |
{ | |
Serial.print((char)buf[i]); | |
// Check for newline | |
if (buf[i] == '\n') { | |
// Add return | |
Serial.print('\r'); | |
} | |
} | |
} | |
// delay(10); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment