CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

driver for ftdi 245BM

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
csshah



Joined: 28 Feb 2005
Posts: 24

View user's profile Send private message

driver for ftdi 245BM
PostPosted: Tue Aug 09, 2005 6:40 pm     Reply with quote

hi all
I came across an old post of ftdi 245bm driver for ccs. actually i want to communicate with pc using pic 18f8720 and ftdi 245bm. i found the driver for usb from an old post but dont know how to make use of it in order to communicate with PC. here I am pasting that driver if u can tell me how can i use it with VC++ to get some console window for communication.

[#include .... // include CPU specific header and port definitions

#define TxCQsize 64 // Console Tx buffer size
#define RxCQsize 64 // Console Tx buffer size


//; Console Rx Ring Buffer control
byte Rx_HeadC;
byte Rx_TailC;

//; Console Tx Ring Buffer control
byte Tx_HeadC;
byte Tx_TailC;

// Console Tx buffer
byte Tx_BaseC[TxCQsize];

// Console Rx buffer
byte Rx_BaseC[RxCQsize];



void console_putc(char TxChar)
/************************************************************************************************
;
; Subroutine console_putc
;
; Stdout routine (BLOCKING) for putting characters to the console interface.
;
; On Exit:
;
; ***********************************************************************************************/
{
long counter = 65535; // setup counter to prevent lockup on failure of USB

//; test to determine if the USB device is active
if (!bit_test(USB_PwrEn))
{
while ((counter!=0) && bit_test(USB_WRF))
{
counter--;
}
if (Counter)
{
DBus = TxChar; //; write the character to the data bus
bit_set(USB_WR);
DBusDir = 0; //; set data bus to output
bit_clear(USB_WR);
DBusDir = 0xff; //; set data bus to input
}
else
{
// timeout waiting on USB
// .. do something else here such as write to serial port
putc(TxChar);
}
}
else
{
//; USB port not active, do something else like pass control to the async port code
putc(TxChar);
}
}


bit console_kbhit(void)
{
// test to determine if the USB device is active
return ((!bit_test(USB_PwrEn)) && (!bit_test(USB_RDF)));
}

char console_getc(void)
{
char Rx_Char = 0x00;

// test to determine if the USB device is active
// if not active pass exit
if ((!bit_test(USB_PwrEn)) && (!bit_test(USB_RDF)))
{
// here we have a character in the USB controller
DBusDir = 0xFF; // set the data bus to input
bit_clear(USB_RD);
Rx_Char = DBus;
bit_set(USB_RD);
}
return (Rx_Char);
}


void main()
{
init_pic();

//; initialise the I/O lines to the USB controller
bit_set(USB_FLUSH); //; initialise the flush FIFO pin
bit_clear(USB_WR); //; set default WR level
bit_set(USB_RD); //; set default RD level

//; initialise Console receive buffer pointers
Rx_HeadC = 0;
Rx_TailC = 0;

//; initialise Console transmit buffer pointers
Tx_HeadC = 0;
Tx_TailC = 0;

printf(console_putc,"Hello, world\r\n");

//ExecLoop
while (1)
{
// do something
// don't forget to scan the USB device
// note that the FTDI245 has a large input buffer
// there is not need to do a buffer to buffer copy
//
}
}
][/code]
asmallri



Joined: 12 Aug 2004
Posts: 1634
Location: Perth, Australia

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Tue Aug 09, 2005 9:18 pm     Reply with quote

Here is a slightly enhanced version of the same. It uses a flag to remember if the USB device is in a stalled state to avoid waiting. The FTDI can effectively stall if the windows machine has no application servicing the receive queue for virtual comm port assigned to the FDTI device. In this case the FTDI transmit buffer fills and, unless you have incorporated error handling, the PIC can loop indefinitiely waiting to send to the FTDI chip. Note this problem is a generic problem not specifically an FTDI issue.

Code:

#include .... // include CPU specific header and USB port definitions

// define the USB Data bus
#define   DBus      PORTD    //  define the USB data bus
#define   DBusDir   TRISD    // define the USB data bus direction register

//  define the PIC I/O busses to the USB Controller
#define   USB_PwrEn   PORTB, 5    // low if USB active, else high
#define   USB_WR      LATB, 7     // I/O write strobe to the USB Controller
#define   USB_RD      LATB, 6     // I/O read strobe to the USB Controller
#define   USB_RDF     PORTE,0     // RD Ready Flag USB Controller
#define   USB_WRF     PORTE,1     // WR Ready Flag USB Controller
#define   USB_Flush   LATE,2      // Flush FIFO ignal to the USB Controller


boolean   USB_Stall = false;   // used to detect USB bus stall


#define putch_usb putc_usb
void putc_usb(char TxChar)
///////////////////////////////////////////////////////////////////////////
//
// Subroutine putc_usb
//
//   Stdout routine (SEMI-BLOCKING) for puting characters to the USB interface.
//
// On Exit:
//
// Calls:
//
///////////////////////////////////////////////////////////////////////////
   {
   unsigned long counter;

   counter = 5000;   // setup counter to prevent lockup on failure of USB
   // test to determine if the USB device is active
   if (!bit_test(USB_PwrEn))
      {
      // if USB ready to accept write operations then clear the stall flag
      if(!bit_test(USB_WRF))
         USB_Stall = false;

      // if the USB device is stalled then exit
      if(bit_test(USB_WRF) && USB_Stall)
         return;

      while ((counter!=0) && bit_test(USB_WRF) && !bit_test(USB_PwrEn))
         {
         restart_wdt();
         counter--;
         }

      if (counter && !bit_test(USB_WRF) && !bit_test(USB_PwrEn))
         {
         DBus = TxChar;      // write the character to the data bus
         bit_set(USB_WR);
         DBusDir = 0;        // set data bus to output
         bit_clear(USB_WR);
         DBusDir = 0xff;      // set data bus to input
         }
      else
         USB_Stall = true;   // USB device appears to have stalled
      }

   }

#define getch_USB getc_USB
char getc_USB()
///////////////////////////////////////////////////////////////////////////
//
// Subroutine getc_USB
//
//   Read a character from the USB controller (BLOCKING IF NO CHARACTER)
//   Returns immediately if the USB controller is off line
//
// On Entry:
//
// On Exit:
//
// Calls:
//
///////////////////////////////////////////////////////////////////////////
   {
   Char RxChar = 0;

   // test to determine if the USB device is active
   if  (!bit_test(USB_RDF) && (!bit_test(USB_PwrEn)))

      {
      // here if the USB port is active and characters are present
      DBusDir = 0xff;      // set data bus to input
      bit_clear(USB_RD);
      RxChar = DBus;        // read the character from the data bus
      bit_set(USB_RD);
      }
   return (RxChar);
   }


boolean kbhit_USB()
///////////////////////////////////////////////////////////////////////////
//
// Subroutine kbhit_USB
//
//   Return true is a character is ready to be extracted from the USB controller
//
// On Entry:
//
// On Exit:
//
// Calls:
//
///////////////////////////////////////////////////////////////////////////
   {
   return(!bit_test(USB_RDF) && (!bit_test(USB_PwrEn)));
   }


void main()
    {
    // do PIC initialization
    // init_pic();

    // initialise the I/O lines to the USB controller
    bit_set(USB_FLUSH); // initialise the flush FIFO pin
    bit_clear(USB_WR);  // set default WR level
    bit_set(USB_RD);     // set default RD level

    printf(putc_usb,"Hello, world\r\n");

    //ExecLoop
    while (1)
      {
      // do something
      // don't forget to scan the USB device
      // note that the FTDI245 has a large input buffer
      // there is not need to do a buffer to buffer copy
      //
      }
  }

_________________
Regards, Andrew

http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!!
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group