pidy Inserito: 16 novembre 2005 Segnala Inserito: 16 novembre 2005 salve a tutti sono nuovo da queste parti e diciamo anche nel campo... infatti prima di tutto spero di aver postato nella sezione corretta...avrei bisogno di preziosi consigli... fino a poco tempo fa usavo un RABBIT2000, interfacciato con una FPGA, che comunicava tramite porta ethernet con un pc remoto.essendo già in commercio, ma non avendolo ancora a disposizione, il RABBIT3000, avevo scritto un codice x emulare il bus esterno (auxiliary bus) sul 2000 stesso (proprio x il fatto che sapevo che prima o poi sarei passato al nuovo micro e questo AIO sembra portare notevoli vantaggi sotto molti punti di vista).ora finalmente ho a dsiposizione il 3000 ma il problema è che mi trovo per la prima volta di fronte a questo BUS e non riesco ad utilizzarlo correttamente anche perchè dai manuali non si capisce molto.innanzittuo una volta definita la seguente: #define PORTA_AUX_IO la porta parallela A e quella parallela B vengono automaticamente inizialiazzate come data_bus e address_bus o devo settare qualche altro registro particolare?e poi quello che mi chiedo, il flusso dati (letture e scritture x capirci) è gestito automaticamente dal BUS o no? e per quanto riguarda gli strobe di lettura e scritura?insomma qualcuno ha mai avuto a che fare con questo auxiliary bus? grazie mille aspetto fiducioso
ifachsoftware Inserita: 16 novembre 2005 Segnala Inserita: 16 novembre 2005 Non ho in questo momento sottomano la documentazione completa (dovrei reinstallare il tutto) , quindi vado a memoria : nel rabbit c'e Questo schema con la loro demoboard dove implementano un master-salve con porta parallela ad 8 bit.Dagli un'occhiata e cerca in empi\rcm3000 del compilatore (vado a memoria) perche' dovrebbe esserci anche un esempio di comunicazione master-slave.Tale comunicazione nell'esempio era fatta tra 2 RABBIT e le loro librerie si occupavano della faccenda.Se devi comunicare tra un RABBIT e l'FPGA o non ho capito bene con che cosa , potresti dare un'occhiata nelle librerie (che sono in codice sorgente) o in alternativa farti te un protocollo per lo scambio dei dati.Concordo pienamente con te che la documentazione del Rabbit e' parecchio incompleta.Ciao
pidy Inserita: 16 novembre 2005 Autore Segnala Inserita: 16 novembre 2005 più che di schematici è proprio un problema di codice C...non riesco a capire se questo AIO una volta attivato con la riga #define AUX_PORTA_IOsetta automaticamente la porta A come bus dati e la porta B come address e se gestisce altrettanto automaticamente le varie letture/scritture dei registri...se cosi fosse (e anche se non riesco a trovare conferme, credo che sia così altrimenti perche' fare delle porte dedicate) in teoria non mi dovrebbe servire inizializzare e definire i vari pin delle porte, e soprattutto non mi dovrebbe servire utilizzare le funzioni IN_DATA e OUT_DATA che avevo scritto x emulare l'AIO sul rabbit2000. riporto qua sotto il codice che mi girava sul 2000 e mi emulava l'AIO.in questo caso usavo la porta parallela F come bus dati e la G come indirizzamento.PC0 e PC2 li usavo invece come IORD e IOWR visto che nel 2000 non c'erano.qualcuno ha idea di come modificare il tutto per usare direttamente l'AIO sul 3000?grazie mille /* La porta F e' utilizzata come bus dati. La porta G fornisce il reset (PG3) attivo basso,l'indirizzo del particolare dispositivo selezionato (PG2-PG0) e l'indirizzo dei registriinterni della periferica (PG7 PG6). PC0 e PC2 fornicono gli strobe di lettura e scritturaattivi bassi PD2 attivo basso emula funzionamento in modalita' I/O esterno del Rabbit 3000 */void Initialize() { WrPortI(PDDDR, &PDDDRShadow, 0x04); // pin utiliz. D in uscita WrPortI(PDDCR, &PDDCRShadow, 0x00); // no open drain WrPortI(PFDDR, &PFDDRShadow, 0x00); // porta F in lettura WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain WrPortI(PGDDR, &PGDDRShadow, 0xCF); // pin utiliz. G in uscita WrPortI(PGDCR, &PGDCRShadow, 0x00); // no open drain WrPortI(PGDR, &PGDRShadow, 0xCF); // uscite della porta G a 1 BitWrPortI(PDDR, &PDDRShadow, 0xFF, 2); // bit 2 porta D a 1 BitWrPortI(PCDR, &PCDRShadow, 0xFF, 0); // no IORD BitWrPortI(PCDR, &PCDRShadow, 0xFF, 2); // no IOWR }void Init(unsigned char opc) { unsigned char temp; //costruzione del valore da caricare su PD temp=0; temp=temp|(opc&0x07); WrPortI(PDDDR, &PDDDRShadow, 0x04); // pin utiliz. D in uscita WrPortI(PDDCR, &PDDCRShadow, 0x00); // no open drain WrPortI(PGDDR, &PGDDRShadow, 0xCF); // pin utiliz. G in uscita WrPortI(PGDCR, &PGDCRShadow, 0x00); // no open drain WrPortI(PFDDR, &PFDDRShadow, 0x00); // porta F in lettura WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain WrPortI(PGDR, &PGDRShadow, temp); // scrive su porta G BitWrPortI(PDDR, &PDDRShadow, 0x00, 2); // abilita il blocco di IO BitWrPortI(PCDR, &PCDRShadow, 0x00, 0); // abilita IORD wait(0); // simula Wait state BitWrPortI(PCDR, &PCDRShadow, 0xFF, 0); // disabilita IORD BitWrPortI(PDDR, &PDDRShadow,0xFF, 2); // disabilita il blocco di IO temp=temp|0x08; WrPortI(PGDR, &PGDRShadow, temp); // disabilita il reset wait(1); } unsigned short In_Data (unsigned char opc, unsigned char reg) { unsigned short data; unsigned char temp; temp=0; WrPortI(PDDDR, &PDDDRShadow, 0x04); // pin utiliz. D in uscita WrPortI(PDDCR, &PDDCRShadow, 0x00); // no open drain WrPortI(PGDDR, &PGDDRShadow, 0xCF); // pin utiliz. G in uscita WrPortI(PGDCR, &PGDCRShadow, 0x00); // no open drain WrPortI(PFDDR, &PFDDRShadow, 0x00); // porta F in lettura WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain temp=temp|reg; // definizione della periferica da leggere temp=temp<<6; temp=temp|(opc&0x07); temp=temp|0x08; WrPortI(PGDR, &PGDRShadow, temp); BitWrPortI(PDDR, &PDDRShadow, 0x00, 2); // abilita blocco I/O BitWrPortI(PCDR, &PCDRShadow,0x00, 0); // abilita IORD wait(0); // simula wait state data=RdPortI(PFDR); // lettura BitWrPortI(PCDR, &PCDRShadow,0xFF, 0); // disabilita blocco IORD BitWrPortI(PDDR, &PDDRShadow,0xFF, 2); // disabilita blocco I/O wait(1); return(data); }void Out_Data(unsigned char opc, unsigned char reg, unsigned short data) { unsigned char temp; temp=0; WrPortI(PDDDR, &PDDDRShadow, 0x04); // pin utiliz. D in uscita WrPortI(PDDCR, &PDDCRShadow, 0x00); // no open drain WrPortI(PGDDR, &PGDDRShadow, 0xCF); WrPortI(PGDCR, &PGDCRShadow, 0x00); temp=temp|reg; // seleziona la periferica e i registro su cui scrivere temp=temp<<6; temp=temp|(opc&0x07); temp=temp|0x08; WrPortI(PGDR, &PGDRShadow, temp); BitWrPortI(PDDR, &PDDRShadow, 0x00, 2); // abilita blocco I/O WrPortI(PFDDR, &PFDDRShadow, 0xFF); // porta F in scrittura WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain temp= (unsigned char)data; WrPortI(PFDR, &PFDRShadow, temp); // dato su porta F BitWrPortI(PCDR, &PCDRShadow,0x00, 2); // abilita IOWR wait(0); // simula wait state BitWrPortI(PCDR, &PCDRShadow,0xFF, 2); // disabilita IOWR WrPortI(PFDDR, &PFDDRShadow, 0x00); // porta F in lettura WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain BitWrPortI(PDDR, &PDDRShadow,0xFF, 2); // disabilita blocco I/O wait(1); }
ifachsoftware Inserita: 17 novembre 2005 Segnala Inserita: 17 novembre 2005 Ti ripeto , prova a guardare nei sorgenti o nelle librerie del compilatore (li apri con un editor ascii) , studiandoteli un poco dovresti trovare risposta ai tuoi dubbi.Ciao
dlgcom Inserita: 17 novembre 2005 Segnala Inserita: 17 novembre 2005 Ciao,Io non ho mai usato questo bus , ma ho trovato QUI qualche cosa che ti puo' aiutare.Per ifach , non sta parlando della porta slave , ma dell' auxiliary bus.
pidy Inserita: 17 novembre 2005 Autore Segnala Inserita: 17 novembre 2005 ciao Luca e innanzitutto grazie...neanche io infatti avevo mai usato questo AIO ma visto che col suo utilizzo le cose migliorano e di parecchio è giunta l'ora di immergersi nel campo...quel link che hai segnalato l'avevo già visto (sono 3 giorni che giro su tutti i forum possibile e immaginabili senza risultati apprezzabili) ed è la dimostrazione che le idee su questo AIO sono molto confuse in quanto da lì sembrerebbe di capire che le porte A e B si inizializzino automaticamente mentre sullo stesso forum (che devo dire è anche il più completo) ma pochi post più sotto dicono l'esatto contrario e cioè che non basta la riga #define PORTA_AUX_IO qui x l'esattezza ma anche in altri post... http://69.93.17.252/support/bb/messages/14...html?1127321877a questo punto non mi resta che provare, sperando che non incorro in uno di quei bug della porta A del 3000..sto scrivendo del codice proprio in questo momento... spero che prima o poi trovi la soluzioneNB: la funzionalità master-slave è ben diversa dall'AIO bus
ifachsoftware Inserita: 17 novembre 2005 Segnala Inserita: 17 novembre 2005 la funzionalità master-slave è ben diversa dall'AIO
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora