Ir ao conteúdo
  • Cadastre-se

18f4550(ccs c) e tda7319 protocolo i2c


Ir à solução Resolvido por ViniciusKruz,

Posts recomendados

Bom dia pessoal, estou apanhando pra caramba pra fazer esses dois abençoados se "falarem".

 

Este bendito tda7319, é um processador de áudio, cuja função é controlar graves, médios, agudos e volumes em um canal de áudio, isso via i2c.

Não estou conseguindo fazer tal comunicação funcionar de forma alguma, se alguém se dispuser a analisar o protocolo eu ficaria muito agradecido. 

 

Segue o datasheet do CI (é bem pequeno e simples):

http://www.st.com/web/en/resource/technical/document/datasheet/CD00000194.pdf

 

Tentei usar as funções i2c nativas do CCS mas não deu certo, tentei comunicar criando minha própria função com base neste site: 

http://www.todopic.com.ar/foros/index.php?topic=5744.0

mas foi em vão.

 

A página 9 do datasheet mostra como deve ser o protocolo, de imediato não encontrei a informação do endereço do tda7319, até encontrei um site xingling onde o cara coloca este endereço como 0x86, não sei de onde ele tirou este endereço! ( http://radio-age.com/make/amp-selector/index.html )

 

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

Realmente, eu não havia percebido, deve ser pelo fato de eu ter observado mais nas tabelas... mas enfim... testei com este endereço mas não deu certo, agora o problema deve ser meu protocolo, de alguma forma deve estar diferente do proposto no datasheet. Vou dar mais uma estudada no protocolo. Obrigado por enquanto.

Link para o comentário
Compartilhar em outros sites

Já chequei o hardware, aparentemente está ok, exceto os pull ups, já coloquei eles.

 

Quanto ao código, é coisa simples:

#include <18F4550.h>#fuses MCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,NOPBADEN#use delay(clock=48000000) #use I2C(master, scl=PIN_B1, sda=PIN_B0, FORCE_HW,fast=200000)//sets the target speed to 200 KBSP i2c_start(); delay_ms(2); i2c_write(0b00000000); //vol 1 delay_ms(2); i2c_write(0b00000001); //vol 2 delay_ms(2); i2c_write(0b10000000); //agudos delay_ms(2); i2c_write(0b10100000); //medios delay_ms(2); i2c_write(0b11000000); //graves delay_ms(2); i2c_write(0b11111111); //mute off delay_ms(2); i2c_stop(); 

Desta forma aí estou usando a biblioteca do próprio ccs, mas não está dando certo. Fiz também, uma sequencia de testes criando minha própria Biblioteca com base nesta do linq que postei acima, mas não estava dando certo também.

Link para o comentário
Compartilhar em outros sites

  • Solução

Consegui fazer ele dar o primeiro sinal de vida rerere

 

Alterei a biblioteca citada acima, modifiquei algumas coisas, adicionei uns delays, enfim, ficou assim:

void I2C_start(void)// coloca o barramento na condição de start{   //apaga_scl;  // coloca a linha de clock em nível 0   seta_sda;   // coloca a linha de dados em alta impedância (1)   seta_scl;   // coloca a linha de clock em alta impedância (1)   delay_us(2);   apaga_sda;   // coloca a linha de dados em nível 0   delay_us(1);   apaga_scl;   // coloca a linha de clock em nível 0}void I2C_stop(void)// coloca o barramento na condição de stop{   //apaga_scl;   // coloca a linha de clock em nível 0   apaga_sda;   // coloca a linha de dados em nível 0   seta_scl;   // coloca a linha de clock em alta impedância (1)   delay_us(1);   seta_sda;   // coloca a linha de dados em alta impedância (1)}void i2c_ack()// coloca sinal de reconhecimento (ack) no barramento{   apaga_sda;   // coloca a linha de dados em nível 0   delay_us(1);   seta_scl;   // coloca a linha de clock em alta impedância (1)   delay_us(1);   apaga_scl;   // coloca a linha de clock em nível 0   seta_sda;   // coloca a linha de dados em alta impedância (1)}void I2C_escreve_byte(unsigned char dado){// envia um byte pelo barramento I2C   int conta=8;   apaga_scl;      // coloca SCL em 0   while (conta)   {      // envia primeiro o MSB      if (shift_left(&dado,1,0)) seta_sda; else apaga_sda;      // dá um pulso em scl      seta_scl;      conta--;      delay_us(1);      apaga_scl;   }   seta_sda;}void escreve_eeprom2(){   //if (dispositivo>7) dispositivo = 7;   i2c_start();   i2c_escreve_byte(0x86);   //i2c_escreve_byte(0xa0 | (dispositivo << 1)); // endereça o dispositivo   i2c_ack();   i2c_escreve_byte(0x00);//vol1   i2c_ack();   i2c_escreve_byte(0x01);//vol2   i2c_ack();   i2c_escreve_byte(0x80);//agudos   i2c_ack();   i2c_escreve_byte(0xA0);//medios   i2c_ack();   i2c_escreve_byte(0xC0);//graves   i2c_ack();   i2c_escreve_byte(0xFF);//mute off   i2c_ack();   I2C_stop();}

Agora é só afinar a coisa e vai ficar show de bola. Valeu amigo vtrx, obrigado mesmo!! Abração.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!