Choix I2C ou SPI CAN DAC80501

Bonjour à tous,

Je travaille sur un projet utilisant un DAC80501 (CAN) qui sera alimenté en 5 V (afin d’obtenir une sortie analogique 0–5 V), tandis que le microcontrôleur fonctionne en logique 3,3 V.

Je dois encore choisir entre une interface SPI ou I²C, et j’hésite grandement entre les deux.
Je ne recherche pas forcément de mise à jour rapide de consigne : la fréquence de commande est faible, donc la vitesse de communication n’est pas critique.

Ce qui m’intéresse surtout, c’est la simplicité d’intégration sur le PCB (moins de “place” requise), la facilité de programmation entre les 2 protocoles et surtout la meilleure compatibilité de niveaux logiques entre 3,3 V et 5 V ( pour éviter au maximum les soucis de conversion de niveaux ou d’incompatibilité VIH/VIL).

A priori, le DAC80501 accepte les deux protocoles via la broche SPI2C, mais je ne sais pas lequel s’accommode le mieux de cette différence de tension ( 3,3 V ↔ DAC 5 V). D’après mes recherches, que ce soit en SPI ou I2C, il n’y a pas besoin de level shifter, simplement des résistances pull up.

image

Et les dires d’un ingénieur TI: DAC80501: SPI Interface Voltage - Data converters forum - Data converters - TI E2E support forums

Auriez vous des conseils/retours d’expériences quant à cela?

Merci d’avance pour vos retours.

Première page de la datasheet du DAC

1.62-V VIH with VDD = 5.5 V

Avec un niveau haut à 1.62v tu peux le piloter le DAC avec une sortie 3.3V sans problème, aussi bien en I2C qu'en SPI.

Après, I2C ou SPI c'est comme tu veux.
La seule contrainte, c'est si tu choisis l'I2C, il faut que les pullups soient tirés au 3.3V pas au 5V.

Juste pour la préciseion, je suppose que vous vouliez dire CNA ?

CAN = Convertisseur Analogique vers Numérique
CNA = Convertisseur Numérique vers Analogique

Ou en anglais

ADC = Analog to Digital Converter
DAC = Digital to Analog Converter

Je placerais le choix dans un autre domaine : la vitesse.

L'I2C est lente ; F_Horl = 100 kHz ou 400 kHz et 16 bits envoyés pour seulement 8 qui contiennent de l'information, l'adresse de l'esclave n'est pas une information au sens de la théorie de l'information.

Le SPI est rapide, pour un simple Atmega à 16 MHz, l'horloge SPI peut aller jusqu'à 8 MHz, 40 MHz avec un ESP32. Pas d'adresse à transmettre.

Le SPI mobilise un gpio supplémentaire si tu as plus d'un esclave SPI sur le bus.
Si tu n'as qu'un seul esclave SPI sur le bus, il suffit de mettre sa pin CS à la masse, sauf si la bibliothèque est mal fichue et exige un gpio CS, dans ce cas le gpio est pris mais tu n'es pas obligé de le router.

Donc un seul esclave SPI sans MiSo c'est : 2 fils comme l'I2C : Fsck et MoSi.

Tout dépend de ton application.
Si c'est juste pour générer un niveau continu l'I2C convient parfaitement.
Si c'est pour générer un signal complexe ou de fréquence relativement élevée, il faut voir.
Selon ton cahier des charges le SPI pourrait être le seul mode qui convient.

Je pars du principe que la référence du CI est la bonne :laughing:.
Le CI est bien mixte I2C/SPI

Oui C’est bien un DAC donc en français un CNA pas un CAN comme l’a dit @zebananos - je voulais juste lui faire noter la différence.

D'un autre côtt, @zebananos ayant écrit

On se doute bien qu'il s'agit d'un DAC ou CNA je crois.

Merci pour vos nombreuses réponses, quant aux spécificités de branchements et aux compatibilité.

Oui en effet, je voulais dire CNA et non l'inverse, Excusez moi pour cette confusion qui est t d'ailleurs plus une erreur de frappe qu'autre chose, mais @J-M-L fait bien de le souligner.

Sachant que je n'ai que ce CI en SPI dans mon montage, si cela permet une vitesse plus élevée avec le même nombre de cable que I2C et une résistance Pull up de moins, autant privilégié SPI qui permettrait si besoin est, de permettre des changements de consigne rapides. De plus il existe davantage de forum à propos du spi plutôt que du i2c.

Et concernant le code, savez vous si un des deux protocoles est plus “complexe” que l'autre, ou les 1 se valent? Je ne veux pas galèrer dans le code, même si aujourd'hui on trouve des tuto et aides un peu partout.

Je vais me renseigner pour les branchements selon la datasheet et reviens vers vous si je bloque.

Bonne soirée

Tu n'as toujours pas dit ce que tu voulais faire avec.
En ne dévoilant rien tu te prives d'une aide précieuse.

La démarche logique de développement quand on choisi un composant c'est de simultanément vérifier qu'il existe des bibliothèques qui le gère et de vérifier quelles fonctions sont disponibles dans les bibliothèques.
Et dans le cas présent, puisque tu n'as qu'un composant SPI sur le bus, a ta place de regarderais si un gpio pour le CS n'est pas exigé par la ou les bibliothèques avant de faire mon choix.

Je viens de faire dans un moteur de recherche "Github DS80501"

Pour la première bibliothèque dans la liste de vois ceci :

dac.begin(&SPI, SPI1_SCK, SPI1_MISO ,SPI1_MOSI, SPI1_CS) ;

La bibliothèque exige Miso et CS dont tu n'as pas besoin.
CS cela se comprend il peut y avoir plusieurs DAC sur le bus, MiSo je ne comprend pas puisque le DAC n'envoie pas d'information vers le maitre, ou alors je n'ai pas compris le fonctionnement du DAC, ce n'est pas impossible je n'ai fait que lire la datasheet en diagonale.

Clairement, pour moi, il ne faut pas te précipiter pour faire un circuit imprimé sans avoir bien choisi un composant et une bibliothèque.

Point particulier :
Est-ce qu'on peut faire un dac.begin incomplet ?
Je n'en sait rien, je laisse la parole a des personnes qui en connaissent plus que moi.

Oui je m’en doute, je voulais juste souligner les différences pour des débutants qui tomberaient sur votre post et auraient un doute .

C'est une bibliothèque pour les ESP32 le constructeur attend MISO mais on peut la déclarer inutilisée en passant -1 en argument.

Merci pour l’info.
Question : est ce particulier à cette bibliothèque ou est-ce général ?

@zebananos
Quel microcontroleur utilises tu ?

C'est une particularité de la librairie SPI pour les ESP32. Peut-être trouve-t-on la même chose sur d'autres processeurs ayant plusieurs contrôleurs SPI.
Comme il y a plusieurs contrôleurs SPI dans l'ESP32 il faut préciser lequel on configure.
Comme il y a possibilité de passer par une matrice d'interconnexion entre les contrôleurs et les GPIOs on déclare quelle broche on affecte à quelle fonction.
Et on peut indiquer que l'on n'utilise pas telle ou telle broche (sauf CLK évidemment).

Bonjour,

Pour moi le choix ne doit pas s'arrêter à une question de vitesse.

Une question d'ailleurs à se poser aussi est "quelle vitesse minimum ais je besoin?".

Si avec mon DAC j'envoie une consigne analogique qui va rester stable pendant une ou plusieurs heures, je n'ai pas besoin d'avoir un système rapide.

Je peux donc laisser dans ce cas la rapidité de côté et m'intéresser à quelle est la méthode la plus simple en terme de câblage et codage pour envoyer ma consigne numérique.

Le bus I²C, comme son noms l'indique, c'est un bus, il peut y avoir plusieurs émetteurs récepteurs sur la même ligne.
C'est de l'Open Drain, il faut des pullup, et TI dit qu'il n'y a pas besoin de level converter.

L'SPI, il faut si j'ai bien compris, un CS par composants si tu en a plusieurs, pas besoin de pullup ni de level converter.

Reste à déterminer la question codage, lequel est le plus facile à coder?
Avec quelle bibliothéque?

Bonnes questions je crois?
Moi je ne sais pas y répondre.

En effet, la rapidité ne sera pas primordiale, c'est pour alimenter un AOP pour une régulation analogique, en lien avec ma question concernant la stabilité d'un AOP posée le même jour sur le forum.

Mais si on peut avoir la vitesse en plus pour une quelconque adaptation future du montage, profitons en! Mais la question se situe en effet plus au niveau de la simplicité de montage sur pcb et du codage.

C'est dans le cadre d'uun projet pédagogique, donc je suis + ou - contraint d'utiliser du micropython: le micro sera donc un raspberry pi pico 2w. Donc il faut que je me renseigne sur des bibliothèques micropython pour ce dac80501, mais tout ce que je vois est plutôt tourné arduino et esp32 en effet.

Je continue mes recherches de ce côté, si vous avez des pistes je suis preneur. :slight_smile:

Bonne soirée

Bonsoir
Si tu ne trouves aps de bibliothèque micropython pour le DAC (CNA) choisi et si tu ne souhaite pas en créer une il reste un plan B :

utilser en micropython un DAC interne au microcontrolleur de la carte Pi Pico 2W et ajouter en sortie un AOP en montage non inverseur pour passer de la plage [0 , 3V3] à la plage [0,5V] si cette plage de tension est impérative.