ATmega32+TDA1543
Добавлено: Вт окт 28, 2014 14:06:37
Доброго времени суток! Решил воспроизвети звук wav с microsd, сначала с помощю шим на ATmega, (моно, стерео, разные битрейты) все отлично играет. Потом подсоединил TDA1543 для проверки воспроизведения через ее. Дописал процедуру передачи двух байт по I2S как в даташите описано. В итоге играет но звук какбудто очень сильно тянет пленку) Подумал не хватает скорости для передачи програмно I2S, поменял кварц с 14Мгц на 16Мгц не помогло. Передавал 1 байт моно на 1 канал не помогло. Может кто работал с TDA1543, посмотрите код передачи где я ошибся:
Код: Выделить всё
#include <mega32.h>
#include <delay.h>
#include "diskio.h"
#include "pff.h"
#define _XTAL_FREQ 16000000
#define WS 1
#define BCK 0
#define DATA 2
#define Set_0_DATA PORTA &= ~(1 << DATA)
#define Set_1_DATA PORTA |= (1 << DATA)
#define BeginTakt PORTA &= ~(1 << BCK)
#define EndTakt PORTA |= (1 << BCK)
#define Select_A PORTA &= ~(1 << WS)
#define Select_B PORTA |= (1 << WS)
#define Init_I2S DDRA |= (1 << WS)|(1 << BCK)|(1 << DATA); PORTA |= (1 << WS)|(1 << BCK)|(1 << DATA); Select_A
unsigned char buff[512];
volatile unsigned int n = 0;
void Write_Data(unsigned char DataR, unsigned char DataL)
{
unsigned char i;
Select_A;
for (i = 0; i < 8; i++)
{
if ((DataR & 0x80) == 0x00)
Set_0_DATA;
else
Set_1_DATA;
DataR = DataR << 1;
BeginTakt;
#asm("nop");
EndTakt;
}
Set_0_DATA;
for (i = 0; i < 8; i++)
{
BeginTakt;
#asm("nop");
EndTakt;
}
Select_B;
for (i = 0; i < 8; i++)
{
if ((DataL & 0x80) == 0x00)
Set_0_DATA;
else
Set_1_DATA;
DataL = DataL << 1;
BeginTakt;
#asm("nop");
EndTakt;
}
Set_0_DATA;
for (i = 0; i < 8; i++)
{
BeginTakt;
#asm("nop");
EndTakt;
}
}
interrupt[TIM0_OVF] void Timer0_OVF_8bit (void)
{
Write_Data(buff[n], buff[n]); // Предпологаю что ошибка тут.
n++;
if (n > 511) n = 0;
TCNT0 = 0xC5; //~32000 Гц
}
void Play(char *Name)
{
WORD bt;
unsigned char p = 0;
pf_open(Name);
TIMSK = 0x01;
while(1)
{
if (!p && n > 255)
{
pf_read(&buff[0], 256, &bt);
p = 1;
if (bt < 256) break;
}
if (p && n < 256)
{
pf_read(&buff[256], 256, &bt);
p = 0;
if (bt < 256) break;
}
}
TIMSK = 0x00;
}
void main(void)
{
FATFS FS;
DDRA = 0xff;
PORTA = 0x00;
TCCR0 = 0b00000010;
Init_I2S;
delay_ms(100);
if (disk_initialize() == 0) if (pf_mount(&FS) == 0) if (pf_open("1.wav") == 0) PORTA.3 = 1;
delay_ms(1000);
#asm("sei")
Play("1.wav");
while(1)
{
PORTA.3 = !PORTA.3;
delay_ms(1000);
}
}