Buscar

Cap-09-I2C v2

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();

Continue navegando