2017-06-18 3 views
3

J'utilise un SSD1306 OLED et j'ai une question à ce sujet.Écrire des données à SSD1306 via I2C

Lors de l'écriture de données dans son tampon via I2C, certaines bibliothèques écrivent 16 octets à chaque fois.

Par exemple:

void SSD1306::sendFramebuffer(const uint8_t *buffer) { 
    // Set Column Address (0x00 - 0x7F) 
    sendCommand(SSD1306_COLUMNADDR); 
    sendCommand(0x00); 
    sendCommand(0x7F); 
    // Set Page Address (0x00 - 0x07) 
    sendCommand(SSD1306_PAGEADDR); 
    sendCommand(0x00); 
    sendCommand(0x07); 
    for (uint16_t i = 0;i < SSD1306_BUFFERSIZE;) { 
    i2c.start(); 
    i2c.write(0x40); 
    for (uint8_t j = 0;j < 16; ++j, ++i) { 
     i2c.write(buffer[i]); 
    } 
    i2c.stop(); 
    } 
} 

Pourquoi ne pas écrire 1024 octets directement?

+0

Ce n'est pas un problème matériel. Certaines bibliothèques (Arduino) I²C stockent simplement les données que vous leur fournissez jusqu'à la fin de la transmission. Pour éviter une utilisation excessive du tampon, il peut être judicieux d'envoyer des fragments plus petits. – JimmyB

+0

mmmmar, Merci d'avoir accepté ma réponse. Si vous appuyez sur la flèche vers le haut pour l'afficher également, votre action facilitera la recherche de cette réponse. – TomServo

Répondre

1

La plupart des bibliothèques I2C dont j'ai vu le code source, y compris celle de l'Aruduino, partagent les données de cette manière. Bien que la norme I2C ne l'exige pas, comme d'autres affiches mentionnées, il peut y avoir des considérations de tampon. La commande .stop() ici peut signaler au périphérique de traiter les 16 octets qui viennent d'être envoyés et en préparer d'autres.

Invariablement, vous devez lire la fiche technique de votre appareil et comprendre ce qu'il attend pour afficher correctement. Ils disent "RTFM" dans le logiciel, mais le matériel est au moins aussi impitoyable. Vous devez lire et suivre la fiche technique lors de l'interfaçage avec des périphériques matériels externes.

0

La segmentation des données dans plusieurs trames aide lorsque le périphérique de réception n'a pas assez d'espace tampon ou n'est simplement pas assez rapide pour digérer les données à plein débit. L'approche START/STOP peut donner au dispositif de réception un peu de temps pour traiter les données reçues. Dans votre cas spécifique, les blocs de 16 octets semblent être exactement une ligne de l'affichage.

D'autres raisons de segmentation des transferts sont des opérations multi-maîtres, mais cela ne semble pas être le cas ici.

+0

Le streaming des données vers sa DRAM permet au SSD1306 d'accepter n'importe quelle quantité de données à la vitesse de bus maximale prise en charge. (BT, DT.) – JimmyB

+0

Dans ce cas particulier, comme il s'agit d'un affichage sujet à scintiller à l'écran lors de la modification d'une ligne qui vient d'être transférée à l'écran, il se peut facilement que vous puissiez l'éviter en envoyant ligne par ligne d'info. – tofro

+0

Non. - De plus, la DRAM du SSD1306 n'est pas organisée en lignes. – JimmyB