Baixe o app para aproveitar ainda mais
Prévia do material em texto
9 Inter-IC Bus (I2C) Versão 2.0 A interface I2C (Inter-IC Bus) foi desenvolvido pela Philips na década de 80. Ela faz uso de apenas 2 fios e permite a conexão de até 127 dispositivos em uma comunicação relativamente rápida e flexível. Cada dispositivo presente neste barramento tem seu próprio endereço. A qualquer momento, apenas dois dispositivos podem usar o barramento, sendo um mestre e um escravo. O protocolo especifica três possíveis velocidades: • Standard-Mode: até 100 kb/s; • Fast-Mode: até 400 kb/s e • High-Speed-Mode: até 3400 kb/s. Neste capítulo vamos estudar os recursos que o MSP430 oferece para trabalhar com tal protocolo. 11.0. Quero Usar a Interface I2C e não Pretendo Ler Todo este Capítulo O barramento I2C é composto por duas linhas: SDA (Serial Data) e SCL (Serial Clock), às quais estão conectados todos os dispositivos, como mostrado na figura abaixo. Note a necessidade de dois resistores (R) de pull-up, um para cada linha. O valor típico para esses resistores é de 4,7 kΩ. 9.2 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café Um dos dispositivos é o Mestre, responsável por controlar o barramento e os demais são os Escravos. Cada Escravo é identificado por um endereço definido de fábrica. São, na verdade, dois endereços: um para escrita e outro para leitura. O Mestre usa o endereço de escrita do Escravo para enviar dados ao escravo ou então o endereço de leitura do Escravo para receber dados deste escravo. A leitura ou escrita é definida pelo último bit do endereço, vide Figura 9.13. Toda transação pelo barramento I2C é iniciada e terminada pelo Mestre, que endereça um Escravo para enviar ou receber dados. O início de uma transação é marcado pela condição de START e o final pela condição de STOP. Após um START sempre vem o endereço do escravo. O escravo endereçado deve confirmar o endereçamento gerando uma confirmação (ACK) ou uma não-confirmação (NACK) indica falha no endereçamento. Vide Figuras 9.14 e 9.15. O dispositivo que recebe os dados, seja ele Mestre ou Escravo, deve gerar um ACK a cada dado recebido. A geração de um NACK é usada para o receptor finalizar a recepção. Assim, o NACK é usado para indicar que se recebeu o último dado. Vide Figuras 9.16 e 9.17. A figura abaixo apresenta uma típica transmissão pelo barramento I2C. Note que S = START, P = STOP. Nesta figura, quem terminou a transação foi o transmissor, por isso o último dado foi confirmado com um ACK (e não com um NACK). O MSP430 possui duas unidades dedicadas para comunicação I2C, denominadas de USCI_B0 e USCI_B1. Os pinos usados estão na tabela a abaixo, lembre-se de configurar o PxSEL de cada pino. USCI SDA SCL USCI_B0 P3.0 P3.1 USCI_B1 P4.1 P4.2 A USCI_Bx (x = 0 ou 1) facilita ao programador a operação do barramento I2C. Ele solicita tarefas à USCI e monitora nas flags o resultado de cada operação solicitada. É claro que USCI precisa primeiro ser configurada para depois ser utilizada. A sequência abaixo deve ser obedecida para efetivar a configuração. 1. Ativar o reset da USCI_Bx (UCBx_CTL1.UCSWRST = 1) 2. Configurar os registradores 3. Configurar as portas 4. Remover o reset da USCI_Bx (UCBx_CTL1.UCSWRST = 0) 5. Se for o caso, habilitar as interrupções. Estudo Dirigido com o MSP430 9.3 Ricardo Zelenovsky e Daniel Café Para a operação da USCI_Bx é preciso seguir os diagramas de tempo apresentados nas figuras listadas abaixo. O que está na metade superior dessas figuras diz respeito ao programador e na metade inferior estão as respostas da USCI. • Figura 9.23 � Mestre transmissor; • Figura 9.25 � Mestre receptor; • Figura 9.27 � Escravo transmissor e • Figura 9.28 � Escravo receptor. A seleção do baud rate (frequência da linha SCL) é feita no registrador UCBxBRW, de acordo com a fórmula abaixo. �����ê�� � � = �����ê�� �� ���ó� � ����� �� �� � ����� O que se apresentou aqui foi um resumo, recomenda-se a leitura de todo o capítulo para uma melhor compreensão da operação dos recursos I2C disponíveis no MSP. Os exercícios resolvidos, apresentados mais adiante, auxiliam nessa compreensão. Ao final deste capítulo está um gabarito para o leitor, com facilidade, configurar os registradores. 9.1. Fundamentos do Barramento I2C Antes de iniciar o estudo dos recursos I2C oferecidos pelo MSP430, precisamos de alguns conceitos, em especial do emprego de dreno (ou coletor) aberto. Os circuitos digitais fazem uso intenso de transistores, que podem ser de Efeito de Campo (FET) ou Bipolar. O transistor FET é também designado como MOS ou MOSFET, que faz referência à sua tecnologia de fabricação: Metal-Óxido-Semicondutor. A Figura 9.1 mostra a representação esquemática de cada tipo desses transistores. Aqui será feito um estudo muito simples de tais dispositivos. D = Dreno (Drain) F = Fonte (Source) P = Porta (Gate) (a) Transistor de Efeito de Campo C = Coletor (Collector) E = Emissor (Emitter) B = Base (Base) (b) Transistor Bipolar. 9.4 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café (MOSFET) Figura 9.1. Dois tipos de transistores. Para esta abordagem do barramento I2C, vamos apenas estudar o comportamento do transistor como uma chave digital. O controle é feito pela Porta (G) ou pela Base (B), de acordo com o tipo do transistor, conforme mostrado na Tabela 9.1. A explicação aqui apresentada é extremamente simplificada, mas atende à nossa finalidade. Tabela 9.1. Lógica de condução dos transistores MOS Bipolar G = nível alto Conduzindo B = nível alto Conduzindo G = nível baixo Cortado B = nível baixo Cortado Os transistores são usados para construir a saída de portas lógicas. Vamos aqui exemplificar a de 3 estados (tri-state), onde a saída pode ir para ZERO, para UM, ou para ALTA IMPEDÂNCIA (Hi-Z). O controle da condução dos transistores Q1 e Q2 permite a geração desses 3 estados, como mostrado na Figura 9.2. (a) Lógica MOS (b) Lógica Bipolar Estudo Dirigido com o MSP430 9.5 Ricardo Zelenovsky e Daniel Café Figura 9.2. Lógica de saída de um circuito digital. O retângulo marcado com a letra “R” representa um resistor. Esta figura está muito simples e serve apenas para ilustrar o conceito. O estado da saída (S) pode ser controlado com a conveniente aplicação de nível lógico alto (1) ou baixo (0) nas portas (P1 e P2) ou nas bases (B1 e B2) dos transistores. A Tabela 9.2 apresenta todas as possibilidades. Nesta tabela foi usado o “1” para representar o nível alto e o “0” para representar o nível baixo. Se apenas o transistor Q1 está conduzindo, é formado um circuito de baixa impedância para a terra e com isso a saída S vai para zero. Por outro lado, caso apenas o transistor Q2 conduza, forma-se um circuito de baixa impedância para Vcc e com isso a saída S vai para um. Quando Q1 e Q2 estão cortados, não há circuito de baixa impedância nem para Vcc e nem para a terra. Nesse caso, diz-se que a saída S está “flutuando”, ou que ela está em um estado de alta impedância (Hi-Z). Evidentemente, a opção de Q1 e Q2 conduzindo não útil, pois forma- se um circuito de baixa impedância entre Vcc e terra. Tabela 9.2. Lógica da saída S Situação P1 (B1) P2 (B2) Q1 Q2 S 1 1 0 Conduz Cortado 0 2 0 1 Cortado Conduz 1 3 0 0 Cortado Cortado Hi-Z 4 1 1 Conduz Conduz Não usar Vamos analisar agora transições na saída, ou seja, o que acontece quando ela muda de 0 para 1 ou de 1 para 0. Podemos dizer que quando a saída S muda de 0 para 1, o transistor Q2 injeta corrente para levar a saída para Vcc.Por outro lado, quando a saída S muda de 1 para 0, o transistor Q1 drena corrente para levar a saída para zero. O transistor Q2 recebe o nome de “pull-up ativo”, porque ele é responsável por levar saída S para Vcc. Por ser um transistor, ele pode conduzir muito no início da transição e depois diminuir a condução, por isso é chamado de ativo. É importante que Q2 conduza muito no início da transição para garantir a velocidade e depois que a saída está em nível alto, Q2 pode diminuir sua condução. Agora vamos fazer o experimento de remover o transistor Q2, como mostrado na Figura 9.3. Agora se diz que a saída é a “Dreno Aberto”, no caso MOS, ou a “Coletor Aberto”, no caso bipolar. O termo “aberto” é porque o dreno ou o coletor de Q1 não está conectado. Este caso leva a duas condições de saída, como mostrado na Tabela 11.3. 9.6 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café (a) Lógica MOS (b) Lógica Bipolar Figura 9.3. A saída a Dreno aberto e a Coletor aberto. Tabela 9.3. Lógica da saída S, no caso Dreno aberto ou Coletor aberto Situação P1 (B1) Q1 S 1 1 Conduz 0 2 0 Cortado Hi-Z Como era esperado, quando Q1 conduz, a saída vai para 0. Entretanto, quando Q1 está cortado, a saída flutua, ou seja, vai para o estado de alta impedância (Hi-Z). Esta situação não parece ter grande utilidade, pois foi criada uma “porta” que só pode ir para zero e nunca para um. Na verdade, este circuito tem diversas utilidades que fogem ao assunto que aqui nos interessa. A ideia agora colocar um “pull-up” na saída, mas um “pull-up” passivo, ou seja, um resistor. Assim, chega-se a uma situação muito parecida com a da Figura 9.2 e Tabela 9.1. A Figura 9.4 apresenta este caso. Agora está presente o resistor R, que leva a saída S para Vcc quando Q1 estiver cortado. A saída agora funciona de forma semelhante à apresentada na Tabela 9.2, porém a transição da saída S de 0 para 1 é mais lenta, pois é feita com o uso de um pull-up passivo (o resistor). Estudo Dirigido com o MSP430 9.7 Ricardo Zelenovsky e Daniel Café (a) MOS (b) Bipolar Figura 9.4. Lógica de saída de um circuito digital com saída a coletor aberto e usando um resistor (R) de pull-up. Na maioria dos casos, o valor de R não é crítico. Além disso, não é nosso objetivo indicar como calculá-lo. Entretanto, faremos um pequeno juízo sobre seu valor. Quanto menor for o valor de R, mais rápida será a transição de 0 para 1 na saída S. Por outro lado, quanto menor for o valor de R, maior será o consumo de corrente quando a saída estiver em 0. Note que se Q1 conduz, temos apenas R entre Vcc e Terra. Assim, existe uma relação de compromisso no cálculo do valor de R. A figura 9.5 ilustrada de forma aproximada o tempo de subida para o caso com pull-up ativo e para o caso com pull-up passivo. Fica claro que saída com pull-up passivo é mais lenta. Ela se assemelha à carga de um capacitor. Quanto menor for o valor do resistor, mais rápida é a subida. As siglas significam: • VOL � tensão de saída em nível baixo e • VOH � tensão de saída em nível alto. 9.8 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café Figura 9.5. Ilustração do tempo de subida (transição de 0 para 1) numa saída digital. Uma aplicação interessante de dreno (coletor aberto) surge quando conectamos duas saídas a dreno (coletor) aberto, como mostrado na Figura 9.6.a. Foram empregados dois transistores, Q1 e Q2, e apenas um resistor de pull-up. Temos que as duas saídas S1 e S2 foram curto-circuitadas, dando origem à saída S. Vamos fazer uma análise de S em função de S1 e S2. A Tabela 9.4 resume as possíveis combinações de S1 e S2. (a) (b) Figura 9.6. Conexão de duas saídas a dreno aberto, dando origem à saída Wired-AND. Ao examinarmos o circuito da Figura 9.6.a, fica claro que basta que um dos dois transistores conduza, para que a saída S vá para 0. Isto significa que a única opção para termos S = 1 é com os dois transistores cortados. Em outras palavras S = 1 somente quando S1 = 1 e S2 = 1. Ora, isto é a definição de uma porta E. Assim, a conexão de S1 com S2 fez surgir uma porta E, como mostrado na Figura 9.6.b, daí seu nome Wired- AND. Tabela 9.4. Lógica da saída S em função de S1 e S2 Estudo Dirigido com o MSP430 9.9 Ricardo Zelenovsky e Daniel Café Situação Q1 Q2 S1 S2 S 1 Conduz Conduz 0 0 0 2 Conduz Cortado 0 1 0 3 Cortado Conduz 1 0 0 4 Cortado Cortado 1 1 1 O mesmo acontece se usarmos vários transistores. O comportamento continua sendo o igual: a saída só vai para 1 quando todos os transistores estão cortados. Isto permite uma maneira fácil de conseguir comunicação bidirecional. Em tal tipo de comunicação, uma determinada linha ora se comporta como saída, ora se comporta como entrada. A Figura 9.7 apresenta o caso típico de conexão de dois dispositivos I2C. É importante deixar claro que vamos explicar o funcionamento apenas com dois dispositivos, entretanto, o protocolo permite até 127 dispositivos. O valor do resistor R, tipicamente, está entre 2 kΩ a 10 kΩ. Figura 9.7. Conexão de dois dispositivos I2C. A Figura 9.7 exemplifica a conexão de dois dispositivos à linha SDA do barramento I2C. O pequeno triângulo representa o buffer de leitura. Por exemplo, o Dispositivo 1, ao controlar seu transistor Q1, pode escrever na linha SDA. Ele deixa o transistor Q1 cortado para escrever 1 e o coloca em condução quando precisa escrever 0. Através de seu buffer de leitura, o Dispositivo 2 consegue ler o estado da linha SDA. Por exemplo, para o Dispositivo 1 receber uma informação do Dispositivo 2, ele precisa cortar seu transistor Q1. Assim, o Dispositivo 2, usando seu transistor Q2 consegue fazer a linha SDA igual a 0 ou igual a 1. O protocolo especifica que somente um dispositivo, por 9.10 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café vez, pode colocar dados no barramento. Assim, todos os dispositivos presentes cortam seus transistores, à exceção daquele que vai enviar as informações. A Figura 9.8 é um pouco mais técnica. Ela apresenta a forma de se medir o Tempo de Subida numa transição de 0 para 1. Os símbolos significam: • VOL � tensão de saída da porta em nível baixo; • VIL � tensão para a entrada da porta interpretar um nível baixo (zero); • VIH � tensão para a entrada da porta interpretar um nível alto (um) e • VDD � tensão de alimentação do circuito. Figura 9.8. Caracterização do Tempo de Subida (Rise Time) numa transição de 0 para 1. A Tabela 9.5 apresenta detalhes técnicos para as diversas velocidades do protocolo I2C. Cada dispositivo que é adicionado ao I2C aumenta a capacitância do barramento e em consequência o tempo de subida. Assim, há uma limitação para a capacitância total do barramento e o tempo de subida aceitável. Note também que existem duas velocidades “High-Speed”. O filtro de ruído é para evitar disparos acidentais. Na velocidade mais baixa, ele não se faz necessário. Tabela 9.5. Principais parâmetros do protocolo I2C Parâmetros Standard Fast High –Speed High-Speed Velocidade (kBits/seg) 0 a 100 0 a 400 0 a 1700 0 a 3400 Máxima capacitância (pF) 400 400 400 100 Tempo de subida (ηs) 1000 300 160 80 Filtro ruído (ηs) - 50 10 10 Observação: a porta I2C disponível no MSP430 não opera na velocidade High-Speed Estudo Dirigido com o MSP430 9.11 Ricardo Zelenovsky e Daniel Café A construção de um barramento para comunicação I2C é muito simples. Todo dispositivo I2C tem dois pinos: SDA (Serial Data) e SCL (Serial Clock), que devem ser conectados, como mostrado na Figura 9.9. Note a necessidadede dois resistores de pull-up, um para cada linha. Tipicamente, esses resistores têm valor entre 2 kΩ e 10 kΩ. O valor típico é de 4,7 kΩ. No caso do AVR, muitas vezes o pull-up interno das portas é suficiente, o que dispensa o pull-up externo. Figura 9.9. Composição típica de um barramento I2C. 9.1.1. Resumo O barramento I2C é construído com apenas dois condutores, o que lhe dá uma grande facilidade para uso. Por outro lado, como será visto adiante, é preciso de uma sinalização inteligente, para se conseguir enviar e receber informações por apenas esses dois condutores. As duas linhas trabalham com coletor ou dreno aberto, daí a necessidade de resistores de pull-up. Como operam em coletor ou dreno aberto, cada linha (SDA ou SCL) só vai para nível alto se todos os dispositivos a ela conectados mantiverem suas respectivas saídas em nível alto. Se uma das linhas está em nível alto, um dispositivo qualquer pode levá-la para nível baixo. Por outro lado, se uma das linhas está em nível baixo, ela só volta para nível alto quando todos os dispositivos a ela conectados estiverem com suas saídas em nível alto. 9.2. Protocolo I2C O barramento I2C foi apresentado na Figura 9.9 e opera com dreno ou coletor aberto. Novamente, enfatizamos que: • A linha (SCL ou SDA) vai para nível baixo quando um dos dispositivos a ela conectado faz sua saída igual a zero. 9.12 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café • A linha (SCL ou SDA) só vai para nível alto quando todos os dispositivos a ela conectados estão com suas saídas em um. Para se entender o protocolo, é necessário definir uma pequena terminologia, que está apresentada na Tabela 9.6. Tabela 9.6. Terminologia para o Barramento I2C Termo Descrição Mestre É o dispositivo que inicia e termina a transmissão. Ele é responsável por gerar o relógio SCL. Escravo Dispositivo endereçado pelo Mestre. Transmissor Dispositivo que coloca dados no barramento. Receptor Dispositivo que lê os dados do barramento. 9.2.1. Transferência de Bits A linha SDA é destinada a transferir os bits serialmente, enquanto que a linha SCL indica o instante em que existe um bit válido na linha SDA. Durante uma transferência, a indicação de que existe um bit válido na linha SDA é feita com a linha SCL em nível alto. Enquanto a linha SCL está em nível alto, a linha SDA deve permanecer estável. Em outras palavras, a linha SDA só pode ser alterada com SCL em nível baixo. Isto está mostrado na Figura 9.10. Existem duas exceções: na geração da condição de START e da condição de STOP a linha SDA pode mudar mesmo com a linha SCL em nível alto. Figura 9.10. Validação do dado na linha SDA. 9.2.2. Condição de START e STOP O Mestre é o responsável por iniciar e terminar toda transferência de dados. O Mestre inicia uma transferência com uma condição de START e a termina com uma condição Estudo Dirigido com o MSP430 9.13 Ricardo Zelenovsky e Daniel Café STOP. No intervalo entre um START e um STOP, o barramento é considerado ocupado e nenhum outro Mestre pode usá-lo. Assim, após um STOP, o barramento está livre. O truque do protocolo I2C para marcar o início e fim de uma transmissão foi o de permitir a alteração da linha SDA enquanto a linha SCL está em nível alto. Como pode ser visto na Figura 9.11, a Condição de START (representada pela letra S) é gerada com uma transição de alto para baixo na linha SDA enquanto a linha SCL está em nível alto. Por sua vez, a Condição de STOP (representada pela letra P) é gerada com uma transição de baixo para alto na linha SDA enquanto a linha SCL está em nível alto. Figura 9.11. Definição das Condições de START (S) e STOP (P). Toda transação inicia com um START e termina com um STOP. Entre um START e um STOP, o barramento está ocupado. Após o STOP, o barramento está livre. Para o caso em que o Mestre deseja iniciar uma nova transferência sem liberar o barramento ele pode usar a condição de START REPETIDO, ou seja, ao invés de gerar o STOP, ele gera um novo START, como mostrado na Figura 9.12. Para todos os efeitos de comportamento do barramento, o START REPETIDO se parece com um START. Assim, daqui em diante, o termo START também designará o START REPETIDO. Figura 9.12. Emprego das Condições de START (S), de STOP (P) e de START REPETIDO (S). 9.2.3. Formato do Pacote de Endereço O mestre usa o endereço para indicar qual escravo vai participar da transação que foi iniciada. O pacote de endereço tem 7 Bits, mais um bit para especificar se a operação é 9.14 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café de leitura ou de escrita, vide Figura 9.13. Isto permite um espaço de 128 endereços (128 = 27). Pode-se encarar de outra forma: cada dispositivo tem dois endereços, sendo um para leitura e outro para escrita. Por simplicidade vamos adotar a seguinte representação: • SLA+R � Endereço para leitura (Slave Address plus Read) e • SLA+W � Endereço para escrita (Slave Address plus Write) A Figura 9.13 apresenta como exemplo o endereço de 7 bits 0x4A (100 1010 em binário) e a formação do endereço 0x95 (para leitura). Este dispositivo hipotético teria dois endereços: 0x95 para leitura e 0x94 para escrita. É importante notar que cada dispositivo vem de fábrica com um endereço já programado. Figura 9.13. Exemplo do endereço 0x95, ou seja, endereçando o dispositivo 0x4A para leitura. O dispositivo endereçado tem a obrigação de responder ao endereçamento com uma confirmação (ACK = acknowledge). Para fazer isto, o dispositivo endereçado coloca a linha SDA em nível baixo por ocasião do último pulso de SCL. A Figura 9.14 mostra o envio do endereço 0x95 pelo barramento e a consequente confirmação (ACK em vermelho) emitida pelo dispositivo endereçado. Note que o bit mais significativo é enviado primeiro. Todos os sinais da Figura 9.14 foram gerados pelo Mestre do barramento, à exceção do ACK que foi gerado pelo dispositivo endereçado (Escravo). Assim, o Mestre fica sabendo se o dispositivo está pronto operar. Se o dispositivo endereçado está ocupado ou se não pode responder ao endereçamento por alguma razão, ele deve manter a linha SDA em nível alto, o que caracteriza a não confirmação (NACK). Figura 9.14. Exemplo do endereço 0x95 enviado pelo barramento I2C e a confirmação (ACK) emitida pelo dispositivo endereçado. Estudo Dirigido com o MSP430 9.15 Ricardo Zelenovsky e Daniel Café A Figura 9.15 apresenta o caso onde, por alguma razão, o dispositivo endereçado não pôde responder e por isso não enviou a confirmação (NACK). Neste caso, o dispositivo endereçado nada faz, simplesmente deixa a linha SDA em nível alto. Figura 9.15. Exemplo do endereço 0x95 colocado no barramento I2C e a não confirmação (NACK) emitida pelo dispositivo endereçado. Os fabricantes de dispositivos I2C têm liberdade para designar os 7 Bits de endereço. Porém o endereço zero (000 0000 em binário) deve ser reservado para a chamada geral. Endereços do tipo 111 1xxx (em binário) devem ser reservados para emprego futuro. Extensão do SCL: Um ponto interessante para a compatibilização de velocidade é o fato de o escravo poder estender o tempo em que a linha SCL permanece em nível baixo. Graças à lógica de dreno aberto (ou de coletor aberto), se o escravo coloca a linha SCL em nível baixo, ela assim permanece, mesmo que o mestre tente mudá-la para nível alto. O mestre só pode continuar o envio dos dados com a linha SCL em nível alto. Isto também pode ser usado para o escravo, momentaneamente, interromper uma transmissão. Note que esta ação não influi no tempo em quea linha SCL permanece em nível alto. Tal recurso vai ajudar na arbitragem, que será visto na seção 9.5. 9.2.4. Formato do Pacote de Dados Todo pacote de dados tem 8 bits, mais um bit de confirmação (ACK) enviado pelo receptor. O relógio (SCL) é sempre gerado pelo Mestre e cadencia a colocação dos bits no barramento. Podemos exemplificar duas situações: o escravo recebendo dados enviados pelo mestre e, no caso contrário, o mestre recebendo dados enviados pelo escravo. As Figuras 9.16 e 9.17 apresentam os dois casos, considerando que o dado a ser enviado é o byte 0xB9 (1011 1001 em binário). 9.16 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café Figura 9.16. Exemplo do byte 0xB9 (1011 1001) sendo transmitido pelo mestre e recebido por um escravo, que gerou a confirmação ACK. Os sinais gerados pelo escravo estão em vermelho e com uma linha mais grossa. Figura 9.17. Exemplo do byte 0xB9 (1011 1001) sendo transmitido por um escravo e recebido pelo mestre, que gerou a confirmação ACK. Os sinais gerados pelo escravo estão em vermelho e com uma linha mais grossa. Ao final da transmissão, como mostrado nas figuras, o dispositivo que recebe os dados deve gerar a confirmação, levando a linha SDA para nível baixo durante o próximo SCL. Se o receptor deixar a linha SDA em nível alto, significa uma não confirmação (NACK). Em ambos os casos, note que o mestre é o responsável por acionar a linha SCL. 9.2.5. Transmissão pelo Barramento I2C Uma transmissão consiste basicamente de uma condição de START, um endereço (para leitura ou escrita), um ou mais pacotes de dados e uma condição de STOP. Todas essas etapas estão mostradas na Figura 9.18. O protocolo proíbe uma condição de START seguida por uma condição de STOP, ou seja, uma transmissão sem a fase de dados. Deve ser observado que após um START, vários dados podem ser transmitidos pelo barramento, cada um deles seguido por uma confirmação (ACK). Após a confirmação do último dado, o mestre gera uma condição de STOP. Figura 9.18. Típica transmissão pelo barramento I2C. Estudo Dirigido com o MSP430 9.17 Ricardo Zelenovsky e Daniel Café Lembrando do que foi dito no item 9.2.2, caso o mestre queira finalizar a transmissão sem liberar o barramento, ao invés da condição de STOP, ele pode gerar um novo START. 9.2.6. Arbitragem do Barramento I2C O barramento I2C permite a presença de vários mestres. Deve ser lembrando que quando o barramento está ocioso, qualquer mestre pode usar o barramento. O problema surge quando dois ou mais mestres tentam usar ao mesmo tempo o barramento que está ocioso. Por isso, deve ser planejada uma forma de garantir que, por vez, somente um mestre use o barramento. A isso se dá o nome de arbitragem. A lógica a dreno (ou coletor) aberto ajuda a resolver isso de forma bem simples. É importante lembrar que uma linha I2C (SDA ou SCL) só está em nível alto se todos os dispositivos a ela conectados colocarem suas saídas em nível alto. Por outro lado, basta um dispositivo colocar sua saída em nível baixo para que a linha I2C (SDA ou SCL) vai para nível baixo. No caso da arbitragem, é importante lembrar da extensão da linha SCL, vista no item 9.2.3 e exemplificado na Figura 9.19. Figura 9.19. Linha SCL: sincronização entre vários mestres. A explicação a seguir é importante para a arbitragem. Na Figura 9.19 temos dois Mestres, denominados A e B acionando a linha SCL. A figura mostra a intenção de cada mestre e o resultado na linha SCL. O mestre A trabalha com um relógio mais lento que o do mestre B. No início, o mestre A abaixou a linha SCL, já o mestre B pretendia abaixá-la um pouco mais tarde (instante 1). No instante 2, o mestre B quis levantar a linha SCL, mas isso só aconteceu quando o mestre A a levantou. No instante 3, o mestre A pretendia deixar a linha em nível alto por mais algum tempo, mas não pode porque o mestre B a abaixou. Note que o tempo em que a linha SCL ficou em nível baixo foi ditado pelo mestre mais 9.18 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café lento (mestre A) e o tempo em que ela permaneceu em nível alto foi ditado pelo mestre mais rápido (mestre B). É importante ressaltar que tudo isso que aconteceu não caracteriza condição de erro, mas sim de sincronização. O barramento deve trabalhar em uma das velocidades listada na Tabela 9.5. O fato de um mestre alterar a linha mais cedo ou mais tarde, não gera problema algum. Abordemos agora a arbitragem. Dois ou mais mestres podem tentar usar o barramento ao mesmo tempo. Eles enviam a condição de START e vamos considerar o pior caso que é quando todos tem sucesso. Após isso eles vão tentar enviar um endereço ou um dado após o endereço. Cada mestre coloca seu dado na linha SDA e a monitora. O mestre que não conseguiu levar a linha SDA para o estado desejado deve sair da disputa. Ao final, somente um mestre ficará presente. O mestre que abandona a arbitragem deve entrar imediatamente em modo escravo, pois ele pode estar sendo endereçado. Enquanto os mestres que disputam o barramento estiverem enviando os mesmos dados, eles permanecem na disputa. Como é óbvio, um mestre só percebe que deve abandonar a disputa ao falhar em tentar colocar a linha SDA em nível alto. O mestre sempre tem sucesso em colocar a linha SDA em nível baixo. O fato dos mestres gerarem SCL com diferentes períodos não causa problema. Como já vimos, o período em que SCL fica em nível baixo é ditado pelo mestre mais lento e o período em que SCL fica em nível alto é ditado pelo mestre mais rápido. Figura 9.20. Arbitragem do barramento I2C envolvendo a disputa de 3 mestres. Estudo Dirigido com o MSP430 9.19 Ricardo Zelenovsky e Daniel Café A Figura 9.20 apresenta o caso hipotético em que três mestres, denominados de A, B e C tentam ganhar o barramento. No início todos os mestres geram a condição de START, mais ou menos juntos e todos têm sucesso. Após isso, no instante 1, os 3 mestres enviam o mesmo bit 1, cada um colocando sua linha SDA em nível alto. Como os 3 coincidem, todos permanecem na disputa. No instante 2, o mestre A tenta deixar a linha SDA em nível alto, porém os outros dois colocam suas saídas SDA em nível baixo. Com isso, quando a linha SCL vai para nível baixo, o mestre A percebe que não conseguiu controlar a linha SDA e sai da disputa. No instante 3, o mesmo acontece com o mestre B. Assim, do instante 4 em diante o único mestre presente no barramento é o mestre C. Note que um mestre só pode perder a disputa pelo barramento ao tentar colocar a linha SDA em nível alto. A arbitragem prossegue até ficar um só mestre presente. Essa disputa pode envolver toda a fase de endereçamento e seguir pela fase de envio de dados. O mestre que perde a disputa deve entrar imediatamente no modo escravo, pois a operação pode estar endereçando ele próprio. A arbitragem é proibida entre: • Uma condição de START REPETIDO e um bit de dado; • Uma condição de STOP e um bit de dado e • Uma condição de START REPETIDO e um STOP. É responsabilidade do programa garantir que essas condições proibidas nunca aconteçam. Assim, em uma situação de múltiplos mestres, deve-se usar a mesma composição de endereçamento e pacote de dados, ou seja, todas as transmissões devem conter o mesmo número de pacotes de dados. Do contrário, o resultado da arbitragem será indefinido. 9.3. Módulos USCI do MSP430 A arquitetura MSP430 disponibiliza módulos de Interface de Comunicação Serial Universal, denominados de USCI (do inglês Universal Serial Communication Interface). Esses módulos atendem a diversos protocolos de comunicação serial. Sãousadas letras para diferenciar os diferentes módulos. As instâncias de um mesmo módulo são diferenciadas com números. Assim, temos USCI_A0, USCI_A1, USCI_B0, etc. O módulo USCI_Ax (x = 0, 1, 2, ...) suporta: • Modo UART, • Modo IrDA e • Modo SPI. O módulo USCI_Bx (x = 0, 1, 2, ...) suporta: 9.20 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café • Modo I2C e • Modo SPI. O MSP430F5529 oferece quatro módulos: USCI_A0, USCI_A1, USCI_B0 e USCI_B1 9.4. Módulos USCI_Bx do MSP430F5529 Como vimos no tópico anterior, o módulo USCI_Bx é o único capaz de operar com o protocolo I2C, sendo que o MSP430F5529 oferece duas instâncias desse módulo. A tabela abaixo indica os pinos onde as linhas SDA e SCL são disponibilizadas. Tabela 9.7. Disponibilidade das linhas SDA e SCL (LaunchPad) Módulo SDA SCL USCI_B0 P3.0 P3.1 USCI_B1 P4.1 P4.2 O módulo USCI_B0 faz uso de P3.0 e P3.1 e, para tanto, é preciso usar o controle do GPIO e fazer P3SEL.0 = 1 e P3SEL.1 = 1. O valor de P3DIR.0 e P3DIR.1 não importa. O emprego do módulo USCI_B1 é um pouco mais sofisticado, pois seus sinais são disponibilizados com o mapeamento da porta P4, vide item 3.5 e Tabela 3.4 do Capítulo 3. Isto significa que podemos mapear as linhas SCL e SDA em qualquer bit da porta P4. Porém, o LaunchPad apenas disponibiliza os bits 0, 1, 2 e 3 da porta P4. Para ficarmos coerente as indicações de pinagem presentes na foto (vide Figura 3.22) que acompanha o LaunchPad, vamos dar preferência aos pinos P4.1 e P4.2. Tabela 9.8. Código para mapeamento linhas SDA e SCL na Porta P4 Valor Mnemônico Função 14 PM_UCB0SCL SCL 15 PM_UCB0SDA SDA Precisa deste código? Logo a seguir está um trecho de código para remapear os pinos P4.1 (SDA) e P4.2 (SCL) P4DIR |= BIT2 | BIT1; //P4.1 e P4.2 como saídas P4SEL |= BIT2 | BIT1; //P4.1 e P4.2 para função alternativa MOV #0x02D52,&PMAPKEYID //Chave para liberar mapeamento P4MAP1 = PM_UCB1SDA; //P4.1 = SDA P4MAP2 = PM_UCB1SCL; //P4.2 = SCL Estudo Dirigido com o MSP430 9.21 Ricardo Zelenovsky e Daniel Café Listamos a seguir as principais características do módulo USCI_B. • Endereçamento de 7 ou 10 bits; • Chamada geral (General Call); • Suporte para operar em 100kbps e 400 kbps; • Frequência de operação programável; • Recursos para operar em baixo consumo e • Pode despertar com condição de START. A seguir faremos um breve estudo do diagrama de blocos da USCI_Bx. Iniciamos com a seleção do relógio (UCxSCL), que está apresentada na Figura 9.21. Nesta figura, as caixas em verde são configurações que o programador controla. O multiplexador permite que se selecione entre UC1CLK, ACLK ou SMCLK (está repetida). A entrada UC1CLK corresponde a um pino do processador e permite ao usuário fornecer um relógio externo. No caso do MSP430F5529 esse recurso não está disponível. Então, na verdade, temos apenas duas opções relógio: ACLK e SMCLK. Com o Pré-Escalonador, o usuário divide o relógio escolhido, que passa a se chamar BRCLK, de forma a obter SCL na frequência desejada. Note que para o módulo operar como mestre, é preciso fazer UCMST = 1 e somente nesta condição o sinal de relógio UCxSL é disponibilizado na linha SCL. Figura 9.21. Seleção do relógio SCL. Exemplo: Usando SMCLK (1.048.576 Hz) precisamos gerar SCL = 10 kHz. A resposta é fazer UCxBRW = 105. Arredondamos para cima para evitar ultrapassar o valor de 10 kHz. � ���� = 1.048.576 10.000 = 104,8 A Figura 9.22 apresenta o restante do módulo USCI_Bx. Note que a preparação do relógio (UCxSL) já foi feita na figura anterior. Os retângulos verdes indicam opções que o programador pode usar. Nesta figura deve-se notar que cada registrador de deslocamento possui um buffer associado. No caso do transmissor, o programador escreve o dado a ser transmitido no UC1TXBUF. A máquina I2C transfere o dado para o Registrador de 9.22 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café Deslocamento TX e o envia bit-a-bit pelo barramento. É de se notar que enquanto se transmite um dado, é possível escrever o novo dado no registrador UC1TXBUF. Algo semelhante acontece na recepção. O Registrador de Deslocamento RX, recebe os bits que chegam pelo barramento e quando monta um byte, o transfere para o registrador UC1RXBUF. O programador deve ler este dado antes de se completar a recepção de um novo dado. Existem mais dois registradores. O registrador UCBxI2CSA (slave address) que armazena o endereço do escravo quando a USCI opera como mestre, e o registrador UCBxI2COA (own address) que usado para armazenar o próprio endereço do quando a USCI opera como escravo. Figura 9.22. Diagrama de blocos do módulo USCI_Bx. 9.5. Inicialização dos Módulos USCI_Bx Os parâmetros do módulo USCI_Bx só podem ser alterados enquanto o bit de reset da interface (UCSWRST = 1) ativado. Esse bit de reset é ativado por ocasião do PUC (Power-Up Clear), quando se energiza a CPU ou por atuação do programador. Após a configuração do módulo, o reset é removido (UCSWRST = 0) e a UCSBx está pronta para usar. A ativação do bit de reset (UCSWRST = 1) tem os seguintes resultados: • A comunicação I2C é interrompida e para; • Linhas SCL e SDA entram em alta impedância; • Os bits de status são zerados (registrador UCBxI2CSTAT = 0); • Os registradores UCBxIE e UCBxIFG são zerados e Estudo Dirigido com o MSP430 9.23 Ricardo Zelenovsky e Daniel Café • O demais registradores permanecem inalterados. É muito importante a sequência abaixo para inicializar ou reconfigurar o módulo USCI: 1) Ativar o reset (UCSWRST = 1); 2) Inicializar ou reconfigurar os registradores; 3) Configurar as portas; 4) Remover o reset (UCSWRST = 0) e 5) Se for o caso, habilitar as interrupções. 9.6. Modos de Operação da USCI_Bx A seguir faremos um estudo detalhado da interface I2C operando nos diversos modos, sempre usando endereçamento em 7 bits. O endereçamento em 10 bits será estudado mais adiante (somente na próxima versão). São 4 modos, listados a seguir: • Mestre transmissor; • Mestre receptor; • Escravo receptor e • Escravo transmissor. As próximas figuras, que ilustram a operação da USCI, seguem as seguintes convenções. Na parte central da figura, com vários retângulos alinhados na horizontal está representada a atividade do barramento I2C. • Os retângulos maiores são as ações da USCI e os retângulos menores as ações do outro dispositivo I2C. • Os retângulos sombreados fazem referência ao mestre e os claros ao escravo. • Na parte superior estão as atuações do programador e • Na parte inferior a respostas e informações geradas pela USCI, 9.6.1. Modo Mestre Para configurar o modo I2C da USCI é preciso fazer UCMODEx = 3 e UCSYNC = 1. A USCI entra no modo mestre quando se faz o bit UCMST = 1. Se a USCI mestre for parte de um sistema multi-mestre, é preciso configurar o “endereço próprio” no registrador UCBxI2COA. O tamanho do endereço é selecionado pelo bit UCA10. O bit UCGCEN permite que se responda à chamada geral. Resumindo tudo na tabela abaixo. Tabela 9.9. Possibilidades de configuração da USCI no modo mestre Parâmetros Opções UCMODEx = 3 � modo I2C 9.24 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café UCSYNC = 1 � habilita modo síncrono UCBxI2COA = endereço próprio para operar no modo multi-mestre UCMST = 0 � modo escravo = 1 � modo mestre UCA10 = 0 � endereço em 7 bits = 1 � endereço em 10 bits UCGEN = 0 � sem chamada geral = 1 � responde a chamada geral 9.6.1.1. Modo Mestre Transmissor Vamos considerar que foi feita a configuração abaixo:• UCMODEX = 3 � modo I2C • UCSYNC = 1 � síncrono • UCMST = 1 � MSP430 é mestre • UCA10 = 0 � endereço do escravo em 7 bits • UCGEN = 0 � não responde à chamada geral Para iniciar a operação, como mostrado na Figura 9.23, é preciso escrever o endereço do escravo no registrador UCBxI2CSA, fazer UCTR = 1, para indicar que é mestre transmissor e ativar UCTXSTT para gerar a condição de START. A USCI verifica a disponibilidade do barramento, gera a condição de START e transmite o endereço do escravo. A flag UCTXIFG vai a 1 quando a condição de START é gerada e o primeiro dado a ser transmitido já pode ser escrito em UCBxTXBUF. Enquanto o dado a ser transmitido não for escrito no UCBxTXBUF, a USCI segura a linha SCL em nível baixo e tudo fica parado. Após a escrita no UCBxTXBUF, a USCI gera mais um pulso (nono pulso) na linha SCL e assim o escravo endereçado pode enviar o ACK ou NACK. Depois disso tudo, o bit UCTXSTT é apagado e o usuário pode verificar a flag UCNACKIFG. O dado escrito em UCBxTXBUF é então transferido imediatamente para o registrador de deslocamento e enviado pelo barramento. A flag UCTXIFG vai para 1 toda vez que o conteúdo de UCBxTXBUF é copiado para o registrador de deslocamento. Assim, essa flag indica quando se pode escrever um novo dado em UCBxTXBUF. Novamente, se nenhum dado é escrito em UCBxTXBUF, a linha SCL é mantida em nível baixo e tudo fica parado. Após a escrita em UCBxTXBUF, é executado o ciclo de confirmação (ACK) da transmissão do dado anterior. A ativação do bit UCTXSTP gera a condição de STOP logo após a próxima confirmação do escravo (ACK). Se o bit UCTXSTP for ativado durante a fase de endereçamento do escravo ou enquanto a USCI espera a escrita de um dado em UCBxTXBUF, uma condição de STOP é gerada, mesmo se nenhum dado foi transferido para o escravo. Para se transmitir um único dado para o escravo, o bit UCTXSTP deve ser ativado somente depois de iniciada a transmissão deste dado. A flag UCTXIFG serve para indicar se a transmissão do dado foi iniciada. Estudo Dirigido com o MSP430 9.25 Ricardo Zelenovsky e Daniel Café A ativação do bit UCTXSTT serve para gerar uma condição de START REPETIDO. Neste caso o bit UCTR (transmissão ou recepção) pode ser alterado e também pode-se alterar o endereço do escravo. Figura 9.23. Típico diagrama de tempo para o Mestre Transmissor. Se o escravo não confirma a recepção do endereço ou do dado transmitido, a flag UCNACKIFG é ativada, como mostrado na Figura 9.24. O mestre então deve gerar uma condição de STOP ou de START REPETIDO. O dado que porventura estiver no UCBxTXBUF é descartado e junto com o estado do bit UCTXSTT. Ou seja, o mestre precisa ativar novamente UCTXSTT. Figura 9.24. Alternativas para quando o escravo não responde ao endereçamento do mestre transmissor. 9.6.1.2. Modo Mestre Receptor 9.26 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café Vamos considerar que foi feita a configuração abaixo: • UCMODEX = 3 � modo I2C • UCSYNC = 1 � síncrono • UCMST = 1 � MSP430 é mestre • UCA10 = 0 � endereço do escravo em 7 bits • UCGEN = 0 � não responde à chamada geral Para iniciar a operação, como mostrado na Figura 9.25, deve-se escrever o endereço do escravo no registrador UCBxI2CSA, fazer UCTR = 0, para indicar que é mestre receptor e ativar UCTXSTT para gerar a condição de START. A USCI verifica a disponibilidade do barramento, gera a condição de START e transmite o endereço do escravo. O bit UCTXSTT é apagado quando o escravo envia a confirmação do endereçamento (ACK). Após o escravo confirmar o endereçamento (ACK), a USCI recebe o primeiro dado vindo do escravo. Após a recepção deste dado a flag UCRXIFG é ativada indicando que existe um dado pronto para ser lido e a USCI gera a confirmação (ACK). A leitura do registrador UCBxRXBUF apaga a flag UCRXIFG. Agora, o ciclo de recepção se repete, com UCRXIFG indicando quando tem um dado pronto. O mestre pode finalizá-lo com a geração de uma condição de STOP ou START REPETIDO. Se por algum motivo o registrador UCBxRXBUF demorar para ser lido, o mestre mantém o barramento “preso” após a recepção do último bit, ou seja, não gera a confirmação (ACK). A ativação do bit UCTXSTP vai gerar uma não confirmação (NAK) após a recepção do corrente dado e em seguida a condição de STOP. Se a USCI estava parada esperando a leitura do registrador UCBxRXBUF, a não confirmação (NAK) e a condição de STOP são geradas imediatamente. Figura 9.25. Típico diagrama de tempo para o Mestre Receptor. Se o mestre deseja receber um único byte do escravo, o bit UCTXSTP deve ser ativado enquanto este byte está sendo recebido. Para determinar este momento, é interessante Estudo Dirigido com o MSP430 9.27 Ricardo Zelenovsky e Daniel Café consultar (polling) o bit UCTXSTT, pois ele vai a zero quando o escravo confirma o endereçamento (ACK) e inicia a recepção do primeiro dado. Se o escravo não confirma o endereçamento (NAK), a flag UCNACKIFG é ativada, como mostrado na Figura 9.26. O mestre então deve gerar uma condição de STOP ou de START REPETIDO. Figura 9.26. Alternativas para quando o escravo não responde ao endereçamento do mestre transmissor. 9.6.2. Modo Escravo Para configurar a USCI no modo I2C é preciso fazer UCMODEx = 3 e UCSYNC = 1. A USCI entra no modo escravo quando se faz o bit UCMST = 0. Os principais parâmetros estão resumidos na Tabela 9.9, apresentada no tópico anterior. No modo escravo a USCI vai responder ao endereçamento feito por um mestre externo e, em função do endereço recebido, vai transmitir dados ou receber dados. Inicialmente, a USCI deve ser configurada para o modo recepção (UCTR = 0) para poder receber o endereço enviado pelo mestre. Depois, configurando o bit UCTR deve transmitir ou receber dados em função do modo como foi endereçado. O endereço da USCI escrava deve ser programado no registrador UCBxI2COA. Por enquanto vamos considerar o endereçamento em 7 bits (UCA10 = 0). 9.28 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café Quando uma condição de START é detectada, a USCI recebe o endereço enviado pelo mestre e o compara com o seu próprio endereço que foi previamente armazenado no registrador UCBxI2COA. Se eles forem idênticos, a USCI faz o bit UCSTTIFG = 1. 9.6.2.1. Modo Escravo Transmissor Vamos considerar que foi feita a configuração abaixo: • UCMODEX = 3 � modo I2C • UCSYNC = 1 � síncrono • UCMST = 0 � MSP430 é escravo • UCA10 = 0 � endereço do escravo em 7 bits • UCGEN = 0 � não responde à chamada geral A USCI entra no modo escravo transmissor quando o endereço enviado pelo mestre coincide com seu próprio endereço, sendo que o último bit está em 1 (leitura). O escravo transmissor envia dados serialmente seguindo o relógio SCL gerado pelo mestre. O escravo transmissor não pode gerar o relógio, mas ele pode segurar a linha SCL em nível baixo enquanto aguarda um novo dado a ser transmitido. Com isso o barramento fica “parado”. Quando a USCI é endereçada como escravo transmissor, os bits UCSTTIFG, UCTXIFG e UCTR são ativados automaticamente, como mostrado na Figura 9.27. Eles têm os seguintes significados: • UCSTTIFG = 1 � START seguido pelo endereço de escravo da USCI; • UCTR = 1 � endereçamento como escravo transmissor e • UCTXIFG = 1 � o registrador UCBxTXBUF espera pelo dado a ser transmitido. A partir deste momento, a linha SCL é mantida em nível baixo até o que o dado a ser enviado seja escrito no UCBxTXBUF. Quando isso acontece, o escravo gera a confirmação do endereçamento (ACK), apaga o bit UCSTTIFG e transmite o dado. Assim que finaliza a transmissão do dado,a flag UCTXIFG é novamente ativada, indicando que se espera por um novo dado. Após a confirmação (ACK) pelo mestre receptor, o novo dado escrito em UCBxTXBUF é enviado. Se o UCBxTXBUF estiver vazio, a linha SCL é mantida em nível baixo e barramento fica parado. Se o mestre enviar uma não confirmação (NAK) seguida por uma condição de STOP, a flag UCSTPIFG é ativada. Se a não confirmação (NAK) for seguida por uma condição de START REPETIDO, a USCI retorna para a fase de recepção de endereço. Estudo Dirigido com o MSP430 9.29 Ricardo Zelenovsky e Daniel Café Figura 9.27. Típico diagrama de tempo para a USCI operar como Escravo Transmissor. 9.6.2.1. Modo Escravo Receptor Vamos considerar que foi feita a configuração abaixo: • UCMODEX = 3 � modo I2C • UCSYNC = 1 � síncrono • UCMST = 0 � MSP430 é escravo • UCA10 = 0 � endereço do escravo em 7 bits • UCGEN = 0 � não responde à chamada geral A USCI entra no modo escravo receptor quando o endereço enviado pelo mestre coincide com seu próprio endereço, sendo que o último bit está em 0 (escrita). O escravo receptor recebe os dados enviados pelo mestre, seguindo o relógio SCL. O escravo receptor não pode gerar o relógio, mas ele pode segurar a linha SCL em nível baixo enquanto aguarda uma intervenção da CPU. Com isso o barramento fica “parado”. Quando a USCI é endereçada como escravo receptor, o bit UCSTTIFG é ativado e o bit UCTR é apagado, como mostrado na Figura 9.28. Eles têm os seguintes significados: • UCSTTIFG = 1 � START seguido pelo endereço de escravo da USCI e • UCTR = 0 � endereçamento como escravo receptor. Após a recepção do primeiro dado, a USCI gera automaticamente uma confirmação (ACK) e ativa a flag UCRXIFG para indicar que existe um dado pronto em UCBxRXBUF. Em seguida, pode iniciar a recepção de um novo dado. Ao término de uma recepção, se o dado recebido anteriormente ainda não foi lido, a USCI mantém a linha SCL em nível baixo e só gera a confirmação (ACK) após a CPU ler este dado. 9.30 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café O bit UCTXNACK é usado para gerar uma não-confirmação (NAK) ao final da recepção do dado atual. A não-confirmação (NAK) é gerada mesmo quando a linha SCL estava sendo mantida em nível baixo esperando a CPU ler UCBxRXBUF. Neste caso, o último dado recebido sobrescreve o que estava em UCBxRXBUF, ou seja, o dado que estava neste registrador é perdido. Uma boa forma de evitar a perda de um dado é ler primeiro o UCBxRXBUF para só depois ativar o bit UCTXNACK. Quando o mestre gera uma condição de STOP, a flag UCSTPIFG é ativada. Se o mestre gera uma condição de START REPETIDO, a USCI retorna para a fase de recepção de endereço. Figura 9.28. Típico diagrama de tempo para a USCI operar como Escravo Receptor. 9.7. Interrupções da USCI_Bx no Modo I2C Cada USCI tem um único vetor para atender às 6 interrupções que estão disponíveis quando opera no Modo I2C. Temos uma interrupção para a transmissão, uma para a recepção e 3 para as mudanças de estado, como listado na Tabela 9.1. Note que cada flag de interrupção possui uma habilitação em separado. Para que qualquer uma das interrupções possa ocorrer, a flag GIE precisa estar em 1. Tabela 9.1 - Lista das interrupções disponíveis para operação da USCI no modo I2C. Flag Habilitação Evento UCRXIFG UCRXIE Um dado acabou de ser recebido e está pronto para ser lido no registrador UCBxRXBUF. A leitura deste registrador apaga a flag. Estudo Dirigido com o MSP430 9.31 Ricardo Zelenovsky e Daniel Café UCTXIFG UCTXIE O dado acabou de ser transmitido e o registrador UCBxTXBUF está pronto para aceitar um novo dado. A escrita neste registrador apaga a flag. UCSTTIFG USCTTIE Enquanto a USCI estava no Modo Escravo, uma condição de START com o próprio endereço foi detectada. A flag é apagada quando uma condição de STOP é recebida. UCSTPIFG UCSTPIE Enquanto a USCI estava no Modo Escravo, uma condição de STOP foi detectada. A flag é apagada quando uma condição de START é recebida. UCNACKIFG UCNACKIE A USCI esperava por uma confirmação que não chegou. A flag é apagada quando uma condição de START é recebida. UCALIFG UCALIE Aconteceu a perda de arbitragem. A flag UCMST é zerada e a USCI entra no Modo Escravo. A USCI_B0 usa a posição 55 (USCI_B0_VECTOR) da Tabela de Interrupções e a USCI_B1 a posição 45 (USCI_B1_VECTOR). O registrador de vetores de interrupção da USCI (UCBxIV) precisa ser consultado para que se saiba qual das 6 flags provocou a interrupção. A Tabela 9.2 apresenta uma lista com os possíveis resultados da leitura deste registrador. Tabela 9.2. Possíveis resultados da leitura do registrador UCBxIV. Prioridade Valor Flag Descrição 0x0 Nenhum Nenhuma interrupção pendente Maior 0x2 UCALIFG Perda de arbitragem 0x4 UCNACKIFG Não-confirmação (NAK) 0x6 UCSTTIFG Detectada condição de START 0x8 UCSTPIFG Detectada condição de STOP 0xA UCRXIFG Dado recebido Menor 0xC UCTXIFG Buffer de transmissão vazio Apresentamos a seguir uma sugestão para a função (ISR) que vai atender a essas interrupções. No caso, tomamos como exemplo a USCI_B0. É claro que o usuário deverá escrever cada uma das funções para responder aos eventos da porta I2C. #pragma vector = USCI_B0_VECTOR //Vetor = 55 __interrupt void isr_usci_b0(void){ int n; n = __even_in_range(UCB0IV,0xC); switch(n){ case 0x0: break; case 0x2: i2c_arb_lost(); break; case 0x4: i2c_nack(); break; case 0x6: i2c_start(); break; 9.32 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café case 0x8: i2c_stop(); break; case 0xA: i2c_rx(); break; case 0xC: i2c_tx(); break; } } 9.8. Registradores da USCI_Bx no Modo I2C Nesta seção são descritos os registradores da USCI_Bx quando opera no modo I2C. Alguns podem ser acessados como um registrador de 16 bits ou em duas porções de 8 bits, como mostrado na Tabela 9.3. Outros possuem acesso exclusivo em 8 ou 16 bits. Para o programador em C, isso não faz grande diferença, já que o compilador cuida dos detalhes. Para a descrição particular de cada um, para facilitar a ocupação do espaço de cada página, daremos preferência ao acesso usando as porções de 8 bits. Tabela 9.3. Registradores da USCI_Bx quando opera no modo I2C. 16 bits 8 bits Acesso Reset Ordem UCBxCTLW0 UCBxCTL1 R/W 0x1 LSB UCBxCTL0 R/W 0x1 MSB UCBxBRW UCBxBR0 R/W 0 LSB UCBxBR1 R/W 0 MSB - UCBxSTAT R/W 0 - - UCBxRXBUF R/W 0 - - UCBxTXBUF R/W 0 - UCBxI2COA - R/W 0 - UCBxI2CSA - R/W 0 - UCBxICTL UCBxIE R/W 0 LSB UCBxIFG R/W 0 MSB UCBxIV - R 0 - 9.8.1. UCBxCTL0 – Registrador 0 de Controle (USCI_Bx Control Register 0) Este registrador controla o acesso ao modo I2C, o tamanho dos campos de endereços e a configuração da USCI em modo Mestre ou Escravo. Estudo Dirigido com o MSP430 9.33 Ricardo Zelenovsky e Daniel Café Figura 9.29. Descrição dos bits do registrador UCBxCTL0. (R/W) Bit 7: UCA10 – Tamanho do campo de endereço próprio (Own addressing mode select) O usuário seleciona o tamanho do campo de endereço da USCI_Bx quando opera no modo escravo. UCA10 = 0 � Campo de endereço com 7 bits e UCA10 = 1 � Campo de endereço com 10 bits. (R/W) Bit 6: UCSLA10 – Tamanho do campo de endereço do escravo (Slave addressing mode select) O usuário seleciona o tamanho do campo de endereço do escravo a ser acessado, quando a USCI_Bx opera no modo mestre. UCSLA10 = 0 � Campo de endereço com 7 bits e UCSLA10 = 1 � Campo de endereço com 10 bits. (R/W) Bit 5: UCMM – Seleção do ambiente multi-mestre(Multi-master environment select) O usuário define se a USCI_Bx está ou não operando num ambiente com diversos mestres. UCMM = 0 � A USCI é o único mestre presente e por isso a unidade que compara endereços é desabilitada. UCMM = 1 � Vários mestres presentes e a USCI precisa atender ao endereçamento. (R) Bit 4: Reservado Bit reservado, sua leitura sempre resulta em 0. 9.34 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café (R/W) Bit 3: UCMST – Seleção do modo mestre (Master mode select) O programador indica que USCI é a mestre do barramento. Num ambiente multi-mestre, se a USCI perde a arbitragem, este bit é apagado e a USCI passa a operar com escrava. UCMST = 0 � Modo escravo. UCMST = 1 � Modo mestre. (R/W) Bits 2,1: UCMODE – Modo da USCI (USCI mode) O programador seleciona se vai operar nos modos SPI ou I2C. UCMODEx = 0x0, 0x1 e 0x2 � Modo SPI UCMODEx = 0x3 � Modo I2C (R) Bit 0: UCSYNC – Habilitar modo síncrono (Synchronous mode enable) Como a USCI_Bx sempre opera com protocolos síncronos (I2C ou SPI), este bit está sempre em 1 e só pode ser lido. UCSYNC = 0 � Modo assíncrono (não disponível para a USCI_Bx) UCSYNC = 1 � Modo síncrono 9.8.2. UCBxCTL1 – Registrador 1 de Controle (USCI_Bx Control Register 1) Este registrador permite a seleção do relógio para gerar a frequência da linha SCL, além controlar as condições de START, STOP e NACK. Muito importante é o bit de reset da USCI que aqui está disponível . Figura 9.30. Descrição dos bits do registrador UCBxCTL1. (R/W) Bits 7,6: UCSSELx – Seleção do relógio para a USCI Estudo Dirigido com o MSP430 9.35 Ricardo Zelenovsky e Daniel Café (USCI clock source select) Com esses dois bits o programador seleciona o relógio que será usado para gerar a frequência da linha SCL. UCMODEx = 0x0 � UCLKI, relógio por um pino da CPU. Não disponível na F5529. UCMODEx = 0x1 � ACLK UCMODEx = 0x2 � SMCLK UCMODEx = 0x3 � SMCLK (R) Bit 5: Reservado Bit reservado, sua leitura sempre resulta em 0. (R/W) Bit 4: UCTR – Modo transmissor ou receptor (Transmiter or receiver) O programador seleciona se a USCI vai transmitir dados ou receber dados, tanto no modo mestre como no modo escravo. UCTR = 0 � Receptor. UCTR = 1 � Transmissor. (R/W) Bit 3: UCTXNACK – Transmitir um NACK (Transmit a NACK) O programador indica que quer gerar um NACK ao final da operação que está em curso. Este bit é apagado após o envio do NACK. UCTXNACK = 0 � Confirmação normal (ACK). UCTXNACK = 1 � Não confirmar, gerar NACK. (R/W) Bit 2: UCTXSTP – Transmitir condição de STOP (Transmit STOP condition in master mode) Quando no modo mestre, o programador indica que quer gerar uma condição de STOP. Este bit é ignorado se a USCI estiver no modo escravo. Quando no modo Mestre Receptor, a condição de STOP é precedida pela geração de um NACK. Este bit é automaticamente zerado após a condição de STOP ser gerada. UCTXSTP = 0 � Não gerar a condição de STOP. UCTXSTP = 1 � Gerar a condição de STOP. (R/W) Bit 1: UCTXSTT – Transmitir condição de START (Transmit START condition in master mode) Quando no modo mestre, o programador indica que quer gerar uma condição de START. Este bit é ignorado se a USCI estiver no modo escravo. Quando no modo Mestre Receptor, a condição de START REPETIDO é precedida pela geração de um NACK. Este bit é automaticamente zerado após a condição de START ser gerada e o endereço do escravo transmitido. UCTXSTART = 0 � Não gerar a condição de START. UCTXSTART = 1 � Gerar a condição de START. 9.36 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café (R/W) Bit 0: UCSWRST – Reset habilitado por software (Software reset enable) O programador faz o reset da USCI. Vale lembra que a configuração da USCI deve acontecer com este bit ativado. UCSWRST = 0 � Reset desabilitado, USCI liberada para operar. UCSWRST = 1 � Reset habilitado. 9.8.3. UCBxBRW – Registrador de controle do baud rate (USCI_Bx Baud Rate Control Register) Com este registrador o programador seleciona a frequência da linha SCL, ou seja, ele especifica o baud rate de sua transmissão. Como pode ser visto na figura, ele pode ser acessado como um registrador de 16 bits, ou como 2 registradores de 8 bits. A relação entre eles está representada na equação abaixo. Para a seleção da frequência da linha SCL, consultar a figura 9.21. � ����� = 256 × � ����1 + � ����0 Figura 9.31. Descrição do registrador UCBxBRW – Controle do Baud Rate. 9.8.4. UCBxSTAT – Registrador de estado (USCI_Bx Status Register) Com este registrador o programador acompanha alguns acontecimentos importantes do barramento I2C. Estudo Dirigido com o MSP430 9.37 Ricardo Zelenovsky e Daniel Café Figura 9.32. Descrição dos bits do registrador UCBxSTAT. (R) Bit 7: Reservado Bit reservado, sua leitura sempre resulta em 0. (R) Bit 6: UCSCLLOW – USCL em nível baixo (SCL low) Indica se a linha de relógio SCL está sendo mantida em nível baixo. Seu faz sentido quando a USCI está no modo mestre. UCSCLLOW = 0 � Linha SCL não está sendo mantida em nível baixo. UCSCLLOW = 1 � Linha SCL está sendo mantida em nível baixo. (R/W) Bit 5: UCGC – Recebida uma chamada geral (General call address received) Indica que chegou uma chamada geral. Esta flag é gerada quando uma condição de START é recebida. UCGC = 0 � Nenhum endereço de chamada geral foi recebido. UCGC = 1 � Foi recebido endereço de chamada geral. (R) Bit 4: UCBBUSY – Barramento ocupado (Bus busy) Indica se o barramento I2C está sendo usado. UCBBUSY = 0 � Barramento inativo. UCBBUSY = 1 � Barramento ocupado. (R) Bits 3, 2, 1, 0: Reservados Bits reservados, sua leitura sempre resulta em 0. 9.8.5. UCBxRXBUF – Registrador de Recepção 9.38 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café (USCI_Bx Receive Data) Este registrador de 8 bits é só de leitura e contém o último dado recebido pelo barramento I2C. A leitura deste registrador zera a flag UCRXIFG. Figura 9.33. Descrição do registrador UCBxRXBUF. 9.8.6. UCBxTXBUF – Registrador de Transmissão (USCI_Bx Transmit Data) Este registrador de 8 bits é de leitura ou escrita e contém o dado a ser transmitido pelo barramento I2C. A escrita neste registrador zera a flag UCTXIFG. Figura 9.34. Descrição do registrador UCBxTXBUF. 9.8.7. UCBxI2COA – Registrador do Endereço Próprio da USCI_Bx (USCI_Bx I2C Own Address Register) Este registrador de 16 bits contém o endereço da USCI_Bx e também permite habilitar a resposta à chamada geral. Quando em responde à chamada geral, a USCI opera no modo escravo receptor. Estudo Dirigido com o MSP430 9.39 Ricardo Zelenovsky e Daniel Café Figura 9.35. Descrição do registrador UCBxI2COA. (R/W) Bit 15: UCGCEN – Habilitação da resposta à Chamada Geral (General Call response enable) Indica se a USCI_Bx deve ou não responder à chamada geral. UCGCEN = 0 � Não responda à chamada geral. UCGCEN = 1 � Responda à chamada geral. (R) Bits 14:10: Reservados Bits reservados, sua leitura sempre resulta em 0. (R/W) Bits 9:0: Endereço próprio da USCI_Bx (I2C own address) Estes bits especificam o endereço da USCI_Bx quando ela opera no modo escravo. O endereço é alinhado pela direita. Se for selecionado o endereçamento de 7 bits, os bits de 9-7 são ignorados. 9.8.8. UCBxI2CSA – Registrador do Endereço do Escravo (USCI_Bx I2C Slave Address Register) Este registrador de 16 bits contém o endereço do escravo a ser acessado quando a USCI_Bx opera no modo mestre.9.40 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café Figura 9.36. Descrição do registrador UCBxI2CSA. (R) Bits 15:10: Reservados Bits reservados, sua leitura sempre resulta em 0. (R/W) Bits 9:0: Endereço do escravo (I2C slave address) Estes bits especificam o endereço do escravo que a ser acessado. Somente é usado quando a USCI_Bx está no modo mestre. O endereço é alinhado pela direita. Se for selecionado o endereçamento de 7 bits, os bits de 9-7 são ignorados. 9.8.9. UCBxIE – Registrador de Habilitação de Interrupção da USCI_Bx (USCI_Bx I2C Interrupt Enable Register) Este registrador de 8 bits permite habilitar a interrupção para diversos eventos do barramento I2C. Figura 9.37. Descrição do registrador UCBxIE. (R) Bits 7, 6: Reservados Bits reservados, sua leitura sempre resulta em 0. (R/W) Bit 5: UCNAKIE – Habilita interrupção por uma não confirmação (NAK) (Not-acknowledge interrupt enable) UCNACKIE = 0 � Interrupção desabilitada. UCNACKIE = 1 � Interrupção habilitada. Estudo Dirigido com o MSP430 9.41 Ricardo Zelenovsky e Daniel Café (R/W) Bit 4: UCALIE – Habilita da interrupção por perda de arbitragem (Arbitration lost interrupt enable) UCALIE = 0 � Interrupção desabilitada. UCALIE = 1 � Interrupção habilitada. (R/W) Bit 3: UCSTPIE – Habilita da interrupção por receber condição de STOP (STOP condition interrupt enable) UCSTPIE = 0 � Interrupção desabilitada. UCSTPIE = 1 � Interrupção habilitada. (R/W) Bit 2: UCSTTIE – Habilita da interrupção por receber condição de START (START condition interrupt enable) UCSTTIE = 0 � Interrupção desabilitada. UCSTTIE = 1 � Interrupção habilitada. (R/W) Bit 1: UCTXIE – Habilita da interrupção por transmissão completada (Transmit interrupt enable) UCTXIE = 0 � Interrupção desabilitada. UCTXIE = 1 � Interrupção habilitada. (R/W) Bit 0: UCRXIE – Habilita da interrupção por recepção completada (Receive interrupt enable) UCRXIE = 0 � Interrupção desabilitada. UCRXIE = 1 � Interrupção habilitada. 9.8.10. UCBxIFG – Registrador de Flags de Interrupção da USCI_Bx (USCI_Bx I2C Interrupt Flag Register) Este registrador de 8 bits indica eventos do barramento I2C e são ponto de partida de todas as interrupções destinadas à USCI_Bx. 9.42 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café Figura 9.38. Descrição do registrador UCBxIFG. (R) Bits 7, 6: Reservados Bits reservados, sua leitura sempre resulta em 0. (R/W) Bit 5: UCNAKIFG –Interrupção por recepção de uma não confirmação (NAK) (Not-acknowledge received interrupt flag) Esta flag é automaticamente apagada quando uma condição de START é recebida. UCNACKIFG = 0 � Não há interrupção pendente. UCNACKIFG = 1 � Interrupção pendente. (R/W) Bit 4: UCALIFG –Interrupção por perda de arbitragem (Arbitration lost interrupt flag) UCALIFG = 0 � Não há interrupção pendente. UCALIFG = 1 � Interrupção pendente. (R/W) Bit 3: UCSTPIFG – Interrupção por receber condição de STOP (STOP condition interrupt flag) Esta flag é automaticamente apagada quando uma condição de START é recebida. UCSTPIFG = 0 � Não há interrupção pendente. UCSTPIFG = 1 � Interrupção pendente. (R/W) Bit 2: UCSTTIFG – Interrupção por receber condição de START (START condition interrupt flag) Esta flag é automaticamente apagada quando uma condição de START é recebida. UCSTTIFG = 0 � Não há interrupção pendente. UCSTTIFG = 1 � Interrupção pendente. (R/W) Bit 1: UCTXIFG – Interrupção por transmissão completada (USCI Transmit interrupt flag) Estudo Dirigido com o MSP430 9.43 Ricardo Zelenovsky e Daniel Café Esta flag é ativada quando o registrador UCBxTXBUF está vazio. Ela é apagada quando se escreve em UCBxTXBUF. UCTXIE = 0 � Não há interrupção pendente. UCTXIE = 1 � Interrupção pendente. (R/W) Bit 0: UCRXIFG – Interrupção por recepção completada (USCI Receive interrupt flag) Esta flag é ativada quando a USCI disponibiliza um dado no registrador UCBxRXBUF. Ela é apagada quando se lê o UCBxRXBUF. UCRXIFG = 0 � Não há interrupção pendente. UCRXIFG = 1 � Interrupção pendente. 9.8.11. UCBxIV – Registrador de Vetor de Interrupção da USCI_Bx (USCI_Bx I2C Interrupt Vector Register) Este é um registrado de 16 bits e indica o evento mais prioritário dentre os 6 possíveis eventos que podem provocar interrupção. A cada leitura, este registrador retorna um número correspondente à interrupção de maior prioridade dentre as pendentes. Em seguida apaga a flag desta interrupção. Na próxima leitura é retornado um número correspondente à segunda mais prioritária dentre as pendentes e assim por diante. Figura 9.39. Descrição do registrador UCBxIV. Tabela 9.3. Descrição dos valores retornados pela leitura do registrador UCBxIV Prioridade Valor Flag Significado 0x0 - Nenhuma interrupção pendente Maior 0x2 UCALIFG Perda de arbitragem 0x4 UCNACKIFG Recepção de uma não-confirmação (NAK) 0x6 UCSTTIFG Recepção de uma condição de START 0x8 USCTPIFG Recepção de uma condição de STOP 0xA UCRXIFG Dado recebido Menor 0xC UCTXIFG Buffer de transmissão vazio 9.9. Exercícios Resolvidos 9.44 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café Para se propor exercícios com o I2C, evidentemente, precisa-se de um dispositivo I2C. Felizmente o MSP430 F5529 oferece duas USCI que podem operar no protocolo I2C. Então, por facilidade no início, vamos usar a USCI_B0 operando como mestre e a USCI_B1 operando como escravo. ER 9.1. Este exercício tem o objetivo de criar um escravo para ser usado pelos próximos exercícios. Ele tem uma certa complexidade, e pode ser estudado mais tarde. Se o leitor quiser, vá para o próximo exercício resolvido. Pedido: Crie os arquivos para programar a USCI_B1 para operar no modo escravo, tanto transmissor quanto receptor, usando o endereço 42. Quando for endereçada como escravo transmissor, ela envia em sequência os bytes 0, 1, 2, ..., 255, 0, 1, .... Quando endereçada no modo escravo receptor, ela armazena no vetor b1_vet os últimos bytes recebidos. Para não interferir com os programas a serem testados, ela deverá trabalhar com interrupção. Solução: Aqui serão preparadas as rotinas fazer a USCI_B1 operar como escravo no endereço 42 e assim permitir o ensaio da USCI_B0 operando como mestre. Para facilitar o uso dessas rotinas, serão necessários dois arquivos: • USCI_B1.c � com as três funções abaixo e o config_USCI_B1: que configura a USCI como escravo com endereço 42 e habilita interrupções; o rx_USCI_B1: ISR que recebe um dado e armazena no vetor e o tx_USCI_B1: ISR que envia um dado (contador) • USCI_B1.h � header com as declarações necessárias Na tabela abaixo está a configuração dos registradores quando a USCI opera como escravo no endereço 42. Note que ... Tabela 9.4. Configuração da USCI_B1 para operar como escravo no endereço 42 7 6 5 4 3 2 1 0 UCB1CTL0 UCA10 UCSLA10 UCMM - UCMST UCMODE UCSYNC 0 0 0 0 0 3 1 UCB1CTL1 UCSSEL - UCTR UCTXNACK UCTXSTP UCTXSTT UCWRST 0 0 0 0 0 0 1/0 UCB1IE - - UCNACKIE UCALIE UCSTPIE UCSTTIE UCTXIE UCRXIE 0 0 0 0 0 0 1 1 UCB1I2COA 42 Estudo Dirigido com o MSP430 9.45 Ricardo Zelenovsky e Daniel Café // USCI_B1.h // USCI_B1_Header // Definições para USCI_B1 #ifndef USCI_B1_H_ #define USCI_B1_H_ #define MAX_USCI_B1 10 //Tamanho do vetor para receber dados void config_USCI_B1(void); void rx_USCI_B1(void); void tx_USCI_B1(void); volatile char b1_vet[MAX_USCI_B1]; //Vetor para receber dados volatile char b1; //Indexador para o vetor volatile char b1_cont; //Contadorpara transmitir #endif /* USCI_B1_H_ */ //USCI_B1.c // USCI_B1 programada com escravo com endereço = 42 // Escravo transmissor envia 0, 1, 2, ..., 255, 1, 2,... // Escravo receptor guardar os últimos 10 bytes // P4.1 = SDA e P4.2 = SCL #include <msp430.h> #include "USCI_B1.h" void config_USCI_B1(void){ UCB1CTL1 = UCSWRST; //Resetar USCI_B1 UCB1CTL0 = UCMODE_3 | //Modo I2C UCSYNC; //Síncrono UCB1I2COA = 42; //Endereço do Escravo UCB1CTL1 = 0; //UCSWRST=0 UCB1IE = UCTXIE | UCRXIE; //Hab interrp TX e RX P4SEL |= BIT2 | BIT1; //Função alternativa P4REN |= BIT2 | BIT1; //Hab resistor P4OUT |= BIT2 | BIT1; //Pullup for (b1=0; b1<MAX_USCI_B1; b1++) //Zerar vetor b1_vet[b1]=0; b1=0; //Zerar contador __enable_interrupt(); //GIE=1, hab int geral } // ISR da USCI_B1 9.46 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café #pragma vector = USCI_B1_VECTOR //45 __interrupt void isr_USCI_B1(void){ int n; n = __even_in_range(UCB1IV,0xC); //Consultar UCB1IV switch(n){ case 0x0: break; case 0x2: break; case 0x4: break; case 0x6: break; case 0x8: break; case 0xA: rx_USCI_B1(); break; //Rotina RX case 0xC: tx_USCI_B1(); break; //Rotina TX } } // Rotina para receber um byte e guardar no vetor void rx_USCI_B1(void){ b1_vet[b1++] = UCB1RXBUF; //Guardar dado recebido if (b1>MAX_USCI_B1) b1=0; //Verificar limite do vetor } // Rotina para transmitir o contador e incrementá-lo void tx_USCI_B1(void){ UCB1TXBUF = b1_cont++; //Transmitir contador } ER 9.2. Usando a USCI_B0 como mestre, verifique se o escravo 42 (USCI_B1) responde ao endereçamento. Acenda o led verde (L2, P4.7) caso positivo ou acenda o led vermelho (L1, P1.0) caso negativo. Usando dois cabos, conecte os pinos P3.0 (SDA) e P3.1 (SCL) aos pinos P4.1 (SDA) e P4.2 (SCL), respectivamente. Solução: Faremos uso dos arquivos que foram criados no exercício anterior. Por enquanto, não precisamos nos preocupar com seu entendimento. Os arquivos USCI_B1.c e USCI_B1.h devem estar presentes no mesmo diretório da solução deste problema. A figura abaixo indica como conectar as duas USCI. Estudo Dirigido com o MSP430 9.47 Ricardo Zelenovsky e Daniel Café Figura 9.40. Conexão das duas USCI disponíveis no MSP430 F5529 e diagrama de tempo indicando as ações realizadas e as respostas recebidas pelo barramento I2C. Para entender a sequência de ações necessárias para controlar o mestre que endereça um escravo, apresentamos o fluxograma ao lado. Após inicializar a USCI_B0, o programa define o endereço do escravo (42) e também indica que ele vai ser endereçado como receptor, pois o mestre é o transmissor (UTR = 1). O programa pede para gerar a condição de START (UCTXSTT = 1). A flag UCTXIFG = 1 indica que a condição de START foi gerada. Note que em seguida o programa pede para gerar a condição de STOP (UCTXSTP = 1). Neste caso, após enviar o endereço, a USCI_B0 recebe a resposta do escravo (ACK ou NACK) e em seguida gera o STOP pedido. Após gerar a condição de STOP, o bit UCTXSTP volta a zero. Neste momento a flag UCNACKIFG pode ser consultada. Figura 9.41. Fluxograma para endereçar o escravo de endereço 42. É gerado um START e um STOP seguidos, sem a transmissão de qualquer dado. A listagem abaixo apresenta o programa solução. O leitor deve executar o programa alterando o endereço do escravo, que é especificado na linha UCB0I2CSA = 42;. O led verde acende apenas com o endereço 42 e o vermelho para os demais endereços. // ER 9.2 // Endereçar escravo e verificar ACK // Mestre -> USCI_B0: P3.0 = SDA e P3.1 = SCL // Escravo -> USCI_B1: P4.1 = SDA e P4.2 = SCL, endereço 42 #include <msp430.h> #include "USCI_B1.h" //<--- ER 9.1 #define TRUE 1 #define FALSE 0 # define BR10K 105 //com SMCLK // Funções usadas 9.48 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café void config_USCI_B0(void); void config_leds(void); int main(void){ WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer config_USCI_B1(); //<--- ER 9.1, USCI_B1 como escrava config_USCI_B0(); //USCI_B1 como mestre config_leds(); //Configurar Leds UCB0I2CSA = 42; //Endereço do escravo UCB0CTL1 |= UCTR | UCTXSTT; //Gerar START while ( (UCB0IFG & UCTXIFG) == 0); //Esperar START UCB0CTL1 |= UCTXSTP; //Gerar STOP while ( (UCB0CTL1 & UCTXSTP) == UCTXSTP); //Esperar STOP //Teste do ACK if ((UCB0IFG & UCNACKIFG) == 0) P4OUT |= BIT7; //ACK else P1OUT |= BIT0; //NACK while(TRUE); //Prender execução return 0; } // Configurar USCI_B0 como mestre // P3.0 = SDA e P3.1 = SCL void config_USCI_B0(void){ UCB0CTL1 = UCSWRST; //Ressetar USCI_B1 UCB0CTL0 = UCMST | //Modo Mestre UCMODE_3 | //I2C UCSYNC; //Síncrono UCB0BRW = BR10K; //10 kbps UCB0CTL1 = UCSSEL_3; //SMCLK e UCSWRST=0 P3SEL |= BIT1 | BIT0; //Funções alternativas P3REN |= BIT1 | BIT0; P3OUT |= BIT1 | BIT0; } // Configurar Leds void config_leds(void){ P1DIR |= BIT0; P1OUT &= ~BIT0; P4DIR |= BIT7; P4OUT &= ~BIT7; } ER 9.3. Enviar o byte 85 (0x55) para o escravo 42. Solução: Estudo Dirigido com o MSP430 9.49 Ricardo Zelenovsky e Daniel Café Os arquivos USCI_B1.c e USCI_B1.h devem estar presentes no mesmo diretório da solução deste problema, pois eles simulam um escravo no endereço 42. Vamos endereçar o escravo 42 como receptor e enviar para ele um único byte (0x55). Depois, com o CCS, vamos consultar a posição zero do vetor b1_vet, que é onde o escravo armazena os resultados, para conferir se o dado enviado foi recebido. Para enviar um único dado, é preciso um certo cuidado. O segredo está em solicitar a geração da condição de STOP assim que a transmissão do dado for iniciada. 1) É feita a inicialização da USCI_B0 como mestre transmissor (UCTR = 1) e é pedido para gerar o START (UCTXSTT = 1). 2) A flag UCTXIFG = 1 indica que já foi gerado o START e que se pode escrever no UCB0TXBUF o dado (0x55) a ser transmitido. 3) Quando a flag UCTXSTT volta a zero, indica que o escravo já respondeu ao endereçamento (ACK ou NACK). 4) É chamada a função para testar NACK. 5) É pedido para gerar o STOP. 6) Quando a flag UCTXSPT volta a zero, é porque a condição de STOP foi gerada. 9) O programa acende o led verde e finaliza num laço infinito. A função teste_nack é muito simples. Ela testa a flag UCNACKIFG. Caso esteja em 1 é porque o escravo enviou um NACK. Neste caso ela simplesmente acende o led vermelho e prende a execução num laço infinito. // ER 9.3 // Endereçar escravo e transmitir 0x55 // Transmitir um único dado // Mestre -> USCI_B0: P3.0 = SDA e P3.1 = SCL // Escravo -> USCI_B1: P4.1 = SDA e P4.2 = SCL, endereço 42 #include <msp430.h> #include "USCI_B1.h" //<--- ER 9.1 9.50 Capítulo 9 – I2C Ricardo Zelenovsky e Daniel Café #define TRUE 1 #define FALSE 0 # define BR10K 105 //com SMCLK // Funções usadas void teste_nack(void); void config_USCI_B0(void); void config_leds(void); int main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer config_USCI_B1();
Compartilhar