pidy Inserito: 16 novembre 2005 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 16 novembre 2005 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
pidy Inserita: 16 novembre 2005 Autore Segnala Share 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); } Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 17 novembre 2005 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
dlgcom Inserita: 17 novembre 2005 Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
pidy Inserita: 17 novembre 2005 Autore Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 17 novembre 2005 Segnala Share Inserita: 17 novembre 2005 la funzionalità master-slave è ben diversa dall'AIO Link al commento Condividi su altri siti More sharing options...
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