4.9. Barramentos do sensor¶
Um sensor de câmera e o MCU com o qual ele se comunica trocam dois tipos diferentes de dados em dois barramentos diferentes.
4.9.1. Barramento de controle¶
Cada configuração do sensor reside em um registrador do chip – formato de pixel, tamanho do quadro, tempo de exposição, ganho, ganhos de balanço de branco, alvos de controle automático e assim por diante. O MCU lê e escreve nesses registradores por meio de um barramento I2C (alguns sensores usam SPI em vez disso). Dois fios (SCL e SDA) conectam o periférico I2C do MCU à interface I2C do sensor, e cada configuração escolhida pelo usuário é traduzida pelo driver em uma ou mais escritas em registradores nesse barramento.
O barramento de controle opera em uma velocidade tranquila – tipicamente 100 kHz ou 400 kHz. Definir um registrador leva dezenas de microssegundos; reconfigurar o sensor inteiro (um reset, um novo tamanho de quadro, um novo formato de pixel) leva de dezenas a centenas de milissegundos, principalmente porque o chip precisa de um momento para levar o novo modo a um estado estável após cada escrita em registrador. Nada disso precisa acompanhar o fluxo de pixels.
4.9.2. Barramento de dados de pixel¶
Os dados de pixel saem do sensor por um barramento separado, mais largo e muito mais rápido. Duas famílias predominam.
Paralelo é o mais antigo dos dois. Ele carrega oito ou dez linhas de dados para os bits dos pixels, além de um clock de pixel (PCLK), um sinal de linha válida (HSYNC) e um sinal de quadro válido (VSYNC). A cada borda de clock, um byte de pixel aparece nas linhas de dados; HSYNC e VSYNC informam ao receptor onde cada linha e cada quadro começam e terminam. Barramentos paralelos são simples, mas o throughput é limitado pela velocidade com que a matriz de pinos do MCU consegue capturar os dados – tipicamente um clock de pixel de 50 a 100 MHz no limite superior.
MIPI CSI-2 – o Mobile Industry Processor Interface Camera Serial Interface, versão 2 – substituiu em grande parte o paralelo nos novos sensores de imagem. Ele carrega os pixels em um ou mais pares de faixas diferenciais a centenas de megabits por segundo por par, com uma contagem menor de pinos, largura de banda muito maior e menor EMI. O paralelo persiste principalmente em projetos legados e em peças menores e de menor taxa, onde sua simplicidade ainda compensa.
O sensor e o MCU trocam controle em um barramento I2C bidirecional lento e dados de pixel em um barramento paralelo ou MIPI mais largo, mais rápido e unidirecional.¶
Independentemente da família que o sensor usa, o lado do MCU possui um periférico de função fixa que captura os pixels recebidos e os escreve em um framebuffer na memória. O código Python nunca controla esse barramento diretamente; ele apenas lê o framebuffer depois que o hardware terminou de preenchê-lo.