Teensy 4.1 and YM2612

Status
Not open for further replies.

SirTmofBates

New member
Hi all, I recently received a Teensy 4.1, which works great, and I'm currently trying to interface it with a Yamaha YM2612 FM Synthisizer, to eventually be able to play Sega Genesis Music.

I seem to have hit quite a roadblock in getting any output from the YM2612 when driving it with the proper signals, using either my own code, or code that I have modified. The code shown
below is a modified version of code found an in earlier post: Post #70
Code:
/* Map Teensy pins to YM2612 pins */
/* RD can be tied to 3.3 V for now */
#define YM_IC 17
#define YM_CS 18
#define YM_WR 19
#define YM_RD 20
#define YM_A0 21
#define YM_A1 22
#define YM_CLK 23

#define YM_D0 41
#define YM_D1 40
#define YM_D2 39
#define YM_D3 38
#define YM_D4 37
#define YM_D5 36
#define YM_D6 35
#define YM_D7 34

/* transfer one byte to data lines */
/* This code can be optimized later */
void WriteYMData(uint32_t data) {
  digitalWriteFast( YM_D0, data&0x01);
  digitalWriteFast( YM_D1, data&0x02);
  digitalWriteFast( YM_D2, data&0x04);
  digitalWriteFast( YM_D3, data&0x08);
  digitalWriteFast( YM_D4, data&0x10);
  digitalWriteFast( YM_D5, data&0x20);
  digitalWriteFast( YM_D6, data&0x40);
  digitalWriteFast( YM_D7, data&0x80);  
}

void setreg(uint32_t addr, uint32_t data) {
  digitalWriteFast( YM_A0, 0);    /* A0 = 0 for register addres write */
  delayMicroseconds(2);
  digitalWriteFast( YM_CS, 0);    /* CS low to select */
  WriteYMData(addr);
  digitalWriteFast( YM_WR, 0);
  delayMicroseconds(2);
  digitalWriteFast( YM_WR, 1);
  digitalWriteFast( YM_CS, 1);    /* CS high */
  delayMicroseconds(2);
  digitalWriteFast( YM_A0, 1);    /* A0 = 1 for register data write */
  delayMicroseconds(2);
  digitalWriteFast( YM_CS, 0);    /* CS low to select */
  WriteYMData(data);
  digitalWriteFast( YM_WR, 0);
  delayMicroseconds(2);
  digitalWriteFast( YM_WR, 1);
  digitalWriteFast( YM_CS, 1);    /* CS high */
}


//////////////////////////////////////////
//  SETUP AND LOOP
//////////////////////////////////////////


void setup() {
  
  pinMode(YM_A0, OUTPUT);
  pinMode(YM_A1, OUTPUT);
  pinMode(YM_CS, OUTPUT);
  pinMode(YM_WR, OUTPUT);
  pinMode(YM_RD, OUTPUT);
  pinMode(YM_IC, OUTPUT);
  pinMode(YM_D0, OUTPUT);
  pinMode(YM_D1, OUTPUT);
  pinMode(YM_D2, OUTPUT);
  pinMode(YM_D3, OUTPUT);
  pinMode(YM_D4, OUTPUT);
  pinMode(YM_D5, OUTPUT);
  pinMode(YM_D6, OUTPUT);
  pinMode(YM_D7, OUTPUT);

  analogWriteFrequency(YM_CLK, 4000000);
  analogWrite(YM_CLK, 128);

  digitalWriteFast(YM_A1, 1);
  digitalWriteFast(YM_CS, 1);
  digitalWriteFast(YM_WR, 1);
  digitalWriteFast(YM_RD, 1);
  digitalWriteFast(YM_IC, 1);

  /* Now try to setup for making sounds */

  /* Reset YM2612 */
  digitalWriteFast(YM_IC, 0);
  delay(10);
  digitalWriteFast(YM_IC, 1);
  delay(10);

  
  /* YM2612 Test code */ 
  setreg(0x22, 0x00); // LFO off
  setreg(0x27, 0x00); // Note off (channel 0)
  setreg(0x28, 0x01); // Note off (channel 1)
  setreg(0x28, 0x02); // Note off (channel 2)
  setreg(0x28, 0x04); // Note off (channel 3)
  setreg(0x28, 0x05); // Note off (channel 4)
  setreg(0x28, 0x06); // Note off (channel 5)
  setreg(0x2B, 0x00); // DAC off
  setreg(0x30, 0x71); //
  setreg(0x34, 0x0D); //
  setreg(0x38, 0x33); //
  setreg(0x3C, 0x01); // DT1/MUL
  setreg(0x40, 0x23); //
  setreg(0x44, 0x2D); //
  setreg(0x48, 0x26); //
  setreg(0x4C, 0x00); // Total level
  setreg(0x50, 0x5F); //
  setreg(0x54, 0x99); //
  setreg(0x58, 0x5F); //
  setreg(0x5C, 0x94); // RS/AR 
  setreg(0x60, 0x05); //
  setreg(0x64, 0x05); //
  setreg(0x68, 0x05); //
  setreg(0x6C, 0x07); // AM/D1R
  setreg(0x70, 0x02); //
  setreg(0x74, 0x02); //
  setreg(0x78, 0x02); //
  setreg(0x7C, 0x02); // D2R
  setreg(0x80, 0x11); //
  setreg(0x84, 0x11); //
  setreg(0x88, 0x11); //
  setreg(0x8C, 0xA6); // D1L/RR
  setreg(0x90, 0x00); //
  setreg(0x94, 0x00); //
  setreg(0x98, 0x00); //
  setreg(0x9C, 0x00); // Proprietary
  setreg(0xB0, 0x32); // Feedback/algorithm
  setreg(0xB4, 0xC0); // Both speakers on
  setreg(0x28, 0x00); // Key off
  setreg(0xA4, 0x22); // 
  setreg(0xA0, 0x69); // Set frequency
  
}





void loop() {
    delay(1000);
    setreg(0x28, 0xF0); // Key on
    delay(1000);
    setreg(0x28, 0x00); // Key off
}

In order to properly drive the YM2612, which is a 5V device, I am using level-shifter breakout boards based on the TI TXS0108E, purchased on Amazon: Link
When probing the left channel of the YM2612 with an oscilloscope, there is no signal whatsoever, except from some clock noise. The schematic of my breadboarded
circuit is pictured below.
ym2612.jpg

Any help with this would be appreciated, as I'm not entirely sure why this circuit isn't working properly. I have heard that some YM2612 chips have been fake in the
past, but I have no way of easily testing this outside of using code that seems to have worked for others.
 
Status
Not open for further replies.
Back
Top