OpenCores
URL https://opencores.org/ocsvn/igor/igor/trunk

Subversion Repositories igor

[/] [igor/] [trunk/] [avr/] [bus-master/] [busmaster.c] - Rev 4

Compare with Previous | Blame | View Log

/* BUS Master version */
#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdint.h>
#include "busmaster.h"
 
#define DEBUG 1
 
void write_bus_data(uint32_t data);
int32_t read_bus_data(void);
void tristate_data_bus(void);
 
void init_fpgabus(void) {
	// Tristate databus
	DATA0DDR  = 0x00;
	DATA0PORT = 0x00;
	DATA1DDR  = 0x00;
	DATA1PORT = 0x00;
	DATA2DDR  = 0x00;
	DATA2PORT = 0x00;
	DATA3DDR  = 0x00;
	DATA3PORT = 0x00;
 
	// Set addr as output
	ADDRLDDR  |= 0xF0;
	ADDRLPORT |= 0xF0;
 
	ADDRHDDR  |= 0xF0;
	ADDRHPORT |= 0xF0;
 
	// Set RDWR as output
	RDWRDDR	  |= (RD|WR);
	RDWRPORT  |= (RD|WR);
 
	// Set RDY as input
	RDYDDR    &= ~(1<<RDY);
	// Init high
	RDYPORT   &= ~(1<<RDY);
 
	/* Setup interrupt pin as input
	 * ISC11 = 1, ISC10 => Interrupt on falling edge on INT1
	 */
	INTDDR	|= (1<<INT1);
	INTPORT |= (1<<INT1);
	/*EICRA |= (1<<ISC11);
	EICRA &= ~(1<<ISC10);
	EIMSK |= (1<<INT1);*/
}
 
 
 
/* AVR-FGPA COM interrupt routine
 * TODO: ADD BURSTMODE operation
 */
uint32_t bus_read(uint8_t address) {
 
	uint32_t data;
 
	ADDRHPORT &= 0x0F;
	ADDRHPORT |= (address&0xF0);
	ADDRLPORT &= 0x0F;
	ADDRLPORT |= (address<<4);
 
	RDWRPORT &= ~RD;
 
	// send IRQ
	INTPORT &= ~(1<<INT1);
 
	// SPINLOCK on RDY high
	while ( (RDYPIN&(1<<RDY)) != 0 ) ;
 
	// Result is present
	data = read_bus_data();
 
	// Remove RD flag
	RDWRPORT |= RD;
 
	// Reset interrupt signal
	INTPORT |= (1<<INT1);
 
	// SPINLOCK on RDY low
	while ( (RDYPIN&(1<<RDY)) == 0 ) ;
 
	return data;
}
 
void bus_write ( uint8_t address, uint32_t data) {
 
	ADDRHPORT &= 0x0F;
	ADDRHPORT |= (address&0xF0);
	ADDRLPORT &= 0x0F;
	ADDRLPORT |= (address<<4);
 
 
	write_bus_data(data);
 
	RDWRPORT &= ~WR;
 
	// send IRQ
	INTPORT &= ~(1<<INT1);
 
	// SPINLOCK on RDY high
	while ( (RDYPIN&(1<<RDY)) != 0 ) ;
 
	// Remove RD flag
	RDWRPORT |= WR;
 
	tristate_data_bus();
 
	// Remove interrupt
	INTPORT |= (1<<INT);
 
	// SPINLOCK on RDY low
	while ( (RDYPIN&(1<<RDY)) == 0 ) ;	
 
	return;
}
 
void write_bus_data(uint32_t data) {
	// Set all dataports to output
	DATA0DDR  = 0xFF;
	DATA1DDR  = 0xFF;
	DATA2DDR  = 0xFF;
	DATA3DDR  = 0xFF;
 
	DATA0PORT = (char)(data);
	DATA1PORT = (char)(data>>8);
	DATA2PORT = (char)(data>>16);
	DATA3PORT = (char)(data>>24);
 
}
 
 
void tristate_data_bus() {
	// Tristate databus
	DATA0DDR  = 0x00;
	DATA0PORT = 0x00;
	DATA1DDR  = 0x00;
	DATA1PORT = 0x00;
	DATA2DDR  = 0x00;
	DATA2PORT = 0x00;
	DATA3DDR  = 0x00;
	DATA3PORT = 0x00;
	return;
}
 
int32_t read_bus_data() {
	return ((int32_t)DATA3PIN<<24)|((int32_t)DATA2PIN<<16)|((int32_t)DATA1PIN<<8)|(DATA0PIN);
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.