Я собираю драм-машину и сохранил файл заголовка сэмпла со звуком удара, который принимает значения от 0 до 170. Я хочу отправить его через SPI на 10-битный ЦАП MCP4811, который затем выводит его в аудиоразъем 3,5 мм.
Мои контакты MISO, MOSI, SCK и RESET подключены к моему USB-программатору и к ЦАП.
Вот фрагмент аудиофайла, хранящегося в "samples.h"
unsigned const char sample_1[2221] PROGMEM = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, ...}
unsigned int sample_len[1] = {2221}
Так что это образец из 2221 бит. Это я хочу отправить в ЦАП, используя SPI с частотой 22 кГц.
Я использую кристалл 16 МГц, поэтому я установил плавкие предохранители, чтобы использовать его.
Я использую таймер с переполнением 22 кГц.
volatile unsigned int sample_count[1] = {0};
volatile unsigned int audio_out = 0;
volatile unsigned char spi_junk;
int main (void)
sei();
DDRB = 0b10110000; //Set MOSI, SCK and SS as output.
PORTB = (1 << PINB4) //active low on SS.
TIMSK1 = (1<<OCIE1A); //Enable interrupt
TCCR1B = (1<<WGM12) | (1<<CS11); // set CTC mode and divide clk by 8
OCR1A = 91; //16 MHz/(8*91) ~ 22068 Hz
//SPI Init
SPCR = (1<<SPE) | (1<<MSTR); //master, 8 MHz
SPSR = (1<<SPI2X);
ISR (TIMER1_COMPA_vect) {
audio_out = 0;
//If play_track == 1, then the sound should be played back.
if (play_track && sample_count[0] < sample_len[0]){
audio_out += (pgm_read_byte(&(sample_1[sample_count[0]++)));
// send audio_out to 10-bit DAC on SPI
PORTB &= ~(1<<PINB4); // B.4 (DAC /CS)
SPDR = (char) ((audio_out >> 6) & 0x000f); //byte 1 0 0 0 0 b9 b8 b7 b6
while (!(SPSR & (1<<SPIF)));
spi_junk = SPDR;
SPDR = (char) ((audio_out & 0x003f) << 2); //byte 2 b5 b4 b3 b2 b1 b0 0 0
while (!(SPSR & (1<<SPIF)));
spi_junk = SPDR;
PORTB |= (1<<PINB4);
}
Мой PIN-код настроен.
Atmega644 -> ЦАП
MOSI -> SDI
SCK -> SCK
SS -> /CS
на MCP4811
Vdd -> 5V
Vss -> GND
V_out -> Audio jack.
Остальные контакты на MCP4811 ни к чему не подключены.
Я видел, что audio_out работает должным образом, отображая значение audio_out на ЖК-экране. Но ничего не выводится в ЦАП. Кто-нибудь видит, что может быть не так?
РЕДАКТИРОВАТЬ: Добавлена инициализация SPI, которую я пропустил, чтобы добавить.