Здравствуйте. Подключил цап к мк, по даташиту написал процедуру передачи данных по I2S (синус, пила), прошил, запустил, пила работает а синус нет. Таблица синуса 100% рабочая.
Может кто работал с TDA1543 и протоколом I2S посмотрите код где ошибка:
#include <mega32.h>
#include <delay.h>
#define _XTAL_FREQ 16000000
#define DDRX DDRA
#define PORTX PORTA // Настройка порта (порт A)
#define WS 1 // Выход переключения канала (1 пин)
#define BCK 0 // Выход тактового сигнала (0 пин)
#define DATA 2 // Выход данных (2 пин)
#define Set_0_DATA PORTX &= ~(1 << DATA) // Установка "0" на линии данных
#define Set_1_DATA PORTX |= (1 << DATA) // Установка "1" на линии данных
#define BeginTakt PORTX &= ~(1 << BCK) // Установка "0" на линии тактирования
#define EndTakt PORTX |= (1 << BCK) // Установка "1" на линии тактирования
#define Select_A PORTX &= ~(1 << WS) // Установка "0" на линии выбора канала
#define Select_B PORTX |= (1 << WS) // Установка "1" на линии выбора канала
#define Init_I2S DDRX |= (1 << WS)|(1 << BCK)|(1 << DATA); PORTX &= ~((1 << WS)|(1 << BCK)|(1 << DATA)); // Настройка порта
const unsigned char sin_table[256] = { // Таблица синуса
0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 8,
9, 10, 12, 13, 15, 16, 18, 19, 21, 23, 25, 27, 29, 31, 33, 35,
37, 39, 42, 44, 46, 49, 51, 54, 56, 59, 62, 64, 67, 70, 73, 76,
79, 81, 84, 87, 90, 93, 96, 99, 103,106,109,112,115,118,121,124,
128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174,
176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216,
218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,245,
246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255,
255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,
246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,
218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179,
176,174,171,168,165,162,159,156,152,149,146,143,140,137,134,131,
128,124,121,118,115,112,109,106,103,99, 96, 93, 90, 87, 84, 81,
79, 76, 73, 70, 67, 64, 62, 59, 56, 54, 51, 49, 46, 44, 42, 39,
37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 18, 16, 15, 13, 12, 10,
9, 8, 7, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0};
void Write_Data_I2S(unsigned char DataR, unsigned char DataL) // Процедура передачи двух байт TDA1543 по протоколу I2S
{
unsigned char i;
for (i = 0; i < 8; i++) //Цикл передачи 8 бит от старшего к младшему биту
{
BeginTakt; // Начало такта (0 -> BCK)
if (DataR & 0x80) Set_1_DATA; else Set_0_DATA; // Установка i-ого бита DataR на линии DATA
DataR = DataR << 1; // Переход к следующему биту
EndTakt; // Конец такта (1 -> BCK)
if (i == 6) Select_A; // По окончанию передачи предпоследнего бита меняем канал. (по даташиту)
}
for (i = 0; i < 8; i++) // То же самое для второго канала.
{
BeginTakt;
if (DataL & 0x80) Set_1_DATA; else Set_0_DATA;
DataL = DataL << 1;
EndTakt;
if (i == 6) Select_B;
}
}
void main(void)
{
unsigned char j = 0;
Init_I2S;
while(1)
{
j++;
Write_Data_I2S(sin_table[j], j); // Передаем в первый канал синус, второй - пила.
delay_us(5);
}
}
Сигналы на выходе цап:
Раздел: AVR