Bonjour,
Depuis un moment j'essaie de contrôler un OPL2 avec un Arduino MEGA 2560.
J'ai effectué les branchement sur une plaque d'expérimentation, normalement les branchement sont OK.
Le problème est la lecture/ecriture des registres de la puce, les commandes de lecture (OPL-> arduino) reste muette et je ne sais donc pas si les commandes d'écriture fonctionne.
Voici le code que j'ai écrit pour communiquer avec l'OPL:
//PORT use for data/address line
#define DATA_BUS PORTK
#define CONF_BUS DDRK
//Pin use for command
const int pin_a0 = A0;
const int pin_cs = A1;
const int pin_wr = A2;
const int pin_rd = A3;
const int pin_ic = A4;
void setup() {
ym3812_init();
ym3812_write2(0xA5, 0xAA);
delay(500);
ym3812_read2(0xA5);
}
void loop() {
delay(1000);
}
void ym3812_init() {
pinMode(pin_a0, OUTPUT);
pinMode(pin_cs, OUTPUT);
pinMode(pin_wr, OUTPUT);
pinMode(pin_rd, OUTPUT);
pinMode(pin_ic, OUTPUT);
CONF_BUS = 0xFF;
DATA_BUS = 0x00;
//Trigger
digitalWrite(pin_a0, 0);
delay(10);
digitalWrite(pin_a0, 1);
delay(100);
}
void ym3812_write2(unsigned char reg, unsigned char data) {
CONF_BUS = 0xFF; //OUTPUT
//Address of Register
digitalWrite(pin_a0, 0);
delay(1);
digitalWrite(pin_cs, 1);
delay(1);
digitalWrite(pin_wr, 1);
delay(1);
DATA_BUS = reg;
delay(10);
digitalWrite(pin_wr, 0);
delay(1);
digitalWrite(pin_cs, 0);
delay(1);
digitalWrite(pin_a0, 1);
//reset DATA_BUS
DATA_BUS = 0x00;
//Data of register
delay(100);
digitalWrite(pin_cs, 1);
delay(1);
digitalWrite(pin_wr, 1);
delay(1);
DATA_BUS = data;
delay(10);
digitalWrite(pin_wr, 0);
delay(1);
digitalWrite(pin_cs, 0);
//reset DATA_BUS
DATA_BUS = 0x00;
}
unsigned char ym3812_read2(unsigned char reg) {
unsigned char buffer;
CONF_BUS = 0xFF; //OUTPUT
//Address of Register
digitalWrite(pin_a0, 0);
delay(1);
digitalWrite(pin_cs, 1);
delay(1);
digitalWrite(pin_wr, 1);
delay(1);
DATA_BUS = reg;
delay(10);
digitalWrite(pin_wr, 0);
delay(1);
digitalWrite(pin_cs, 0);
delay(1);
digitalWrite(pin_a0, 1);
//reset DATA_BUS
DATA_BUS = 0x00;
delay(50);
//read
//CONF_BUS = 0x00;
digitalWrite(pin_a0, 0);
delay(1);
digitalWrite(pin_cs, 1);
delay(1);
digitalWrite(pin_rd, 1);
buffer = DATA_BUS;
delay(10);
digitalWrite(pin_rd, 0);
delay(1);
digitalWrite(pin_cs, 0);
delay(1);
digitalWrite(pin_a0, 1);
return buffer;
}
Voici également une capture des transmissions entre arduino et OPL (4bits de données sur 8 + 4 signaux de commandes.)
Je peux également fournir de photo des différents signaux (Horloge, etc..) via mon Oscilloscope analogique (EDIT : Faute de copié-coller j'ai bien en Analyseur logique !)
Datasheets :
YM3812 (OPL2): YM3812 Fiches technique(PDF) - YAMAHA CORPORATION
YM3014 (DAC) : http://www.datasheetspdf.com/PDF/YM3014B/865757/1
Merci d'avance !