P51D
Joined: 25 Jan 2010 Posts: 36
|
FT245rl driver |
Posted: Fri Feb 05, 2010 3:39 am |
|
|
hi all
I've searched for a existing c driver for the ft245 but I didn't find something.
If you have comments to modify the driver so that you can ad this to the code library, only say it.
At the time, I have no possibility to make also a rx-interrupt routine because I have some problem with the sprut burner.
best regards
P51D
driver:
Code: |
//*****************************************************************************
// Definitionen
#define TXE PIN_D9 // Transmitt-enabmle pin
#define WR PIN_D11 // Write pin (high peak)
#define RX PIN_D8 // Receive data Pin
#define RD PIN_D10 // Read pin (during read low)
#define PWREN PIN_F6 // configurations-status
#define USART_DDR_out set_tris_d(0x0000 | (1<<9) | (1<<8))
#define USART_DDR_in set_tris_d(0x00FF | (1<<9) | (1<<8))
#define D0 PIN_D0 // Data-Pins
#define D1 PIN_D1
#define D2 PIN_D2
#define D3 PIN_D3
#define D4 PIN_D4
#define D5 PIN_D5
#define D6 PIN_D6
#define D7 PIN_D7
#define rxBuf_max 100 // buffer size
static int8 index_rxBuf_R = 0; // Index to write RX-Buffer
static int8 index_rxBuf_W = 0; // Index to read RX-Buffer
int8 rxBuf[rxBuf_max + 1]; // RX-Buffer
#define txBuf_max 10 // buffer size
static int8 index_txBuf_R = 0; // Index to write TX-Buffer
static int8 index_txBuf_W = 0; // Index to read TX-Buffer
int8 txBuf[txBuf_max + 1]; // TX-Buffer
//*****************************************************************************
// Functions
//=========== INIT ====================================
void ft245_init(void){
int8 i = 0;
USART_DDR_in; // Default DDR = input
output_high(RD); // set control-pins
output_low(WR);
for(i=0;i<=txBuf_max;i++){ // clear buffers
txBuf[i] = 0;
}
i = 0;
for(i=0;i<=rxBuf_max;i++){
rxBuf[i] = 0;
}
while(input_state(PWREN) == 1); // wait until the USB FTDI-configuration
}
//=========== TX ====================================
// if no new data, return / need to calls in the main
void usart_tx(void){ // send-function
if(input_state(TXE) == 0){ // if sending possible
if(index_txBuf_R == index_txBuf_W){ // no new data => return
return;
}
if(index_txBuf_R == txBuf_max){ // ringbuffer
index_txBuf_R = 0;
}
else{
index_txBuf_R ++;
}
USART_DDR_out; // change ddr from input to output
output_bit(D0,(txBuf[index_txBuf_R] & 0x01)); // write datas to the ftdi
output_bit(D1,(txBuf[index_txBuf_R] & 0x02));
output_bit(D2,(txBuf[index_txBuf_R] & 0x04));
output_bit(D3,(txBuf[index_txBuf_R] & 0x08));
output_bit(D4,(txBuf[index_txBuf_R] & 0x10));
output_bit(D5,(txBuf[index_txBuf_R] & 0x20));
output_bit(D6,(txBuf[index_txBuf_R] & 0x40));
output_bit(D7,(txBuf[index_txBuf_R] & 0x80));
output_high(WR); // new data available
output_low(WR);
USART_DDR_in; // set ddr to input
}
}
void txBuf_write(int8 parameter){ // TX buffer handling
if(index_txBuf_W == txBuf_max){ // ringbuffer
index_txBuf_W = 0;
}
else{
index_txBuf_W ++;
}
txBuf[index_txBuf_W] = parameter;
}
//=========== RX ====================================
// need to calls in the main
void usart_rx(void){ // read function (polling)
int8 data = 0; // data
if(input_state(RX) == 0){ // if new data in the FTDI buffer
if(index_rxBuf_W == rxBuf_max){ // ringbuffer
index_rxBuf_W = 0;
}
else{
index_rxBuf_W ++;
}
// take datas and set it dynamic in the buffer
output_low(RD); // read data
delay_cycles(1);
if(input_state(D0) == 1) data |= (1 << 0);
if(input_state(D1) == 1) data |= (1 << 1);
if(input_state(D2) == 1) data |= (1 << 2);
if(input_state(D3) == 1) data |= (1 << 3);
if(input_state(D4) == 1) data |= (1 << 4);
if(input_state(D5) == 1) data |= (1 << 5);
if(input_state(D6) == 1) data |= (1 << 6);
if(input_state(D7) == 1) data |= (1 << 7);
rxBuf[index_rxBuf_W] = data; // store data
output_high(RD); // read finished
}
}
|
|
|