Après lecture du code AS1107.cpp, pour augmenter la vitesse de transfert, tu dois faire deux modifications :
1) Le SPI est fait en bit-bang logiciel (fonction shiftOut), fait le faire par le HARDWARE, ça sera beaucoup plus rapide.
Pour cela, il faut utiliser la classe SPI.
D'après la page 8 du datasheet (rev 2.28) de l'AS1107, l'AS1107 fonctionne avec :
Une horloge qui doit être à 0 lors du /CS et les données sont mémorisées sur front montant.
D'après
http://fr.wikipedia.org/wiki/Serial_Peripheral_Interface, c'est le mode 0.
Le MSB est transferé en premier.
La fréquence Max de l'AS1107 est de 10MHz, comme celle de l'arduino est à 16MHz, il faut donc diviser par 2 l'horloge de ce périphérique.
2) l'autre problème c'est que les AS1107 sont en série.
Du coup, tu dois toujours envoyer 5 * 16 bits au lieu de 16!
Pour diminuer les temps d'accès connecte tes AS1107 en parallèle.
Côté matériel :
- câble la PIN 51 MOSI sur l'entrée DIN de tous les AS1107
- câble la pin 52 (SCK) sur l'entrée clock de tous les AS1107
- câble une pin /CS (au choix) par AS1107 (à connecter sur LOAD/CSN)
- ne câble pas les DOUT
au total tu dois connecter 7 signaux.
Côté logiciel :
tu ajoute ça dans ta classe AS1107 dans AS1107.h :
byte CS_Array[NbMod];
tu modifie AS1107.c comme ca :
AS1107::AS1107(byte cspin0, byte cspin1, byte cspin2, byte cspin3, byte cspin4)
{
byte i;
CS_Array[0] = cspin0;
CS_Array[1] = cspin1;
CS_Array[2] = cspin2;
CS_Array[3] = cspin3;
CS_Array[4] = cspin4;
for (i = 0; i < NbMod; i++) {
pinMode(CS_Array[i], OUTPUT);
digitalWrite(CS_Array[i], HIGH);
}
SPI.begin(); /* il n'est pas précisé si il faut faire begin avant ou après
* la config. Donc il faut peux être modifier l'ordre */
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV2);
SPI.setBitOrder(MSBFIRST);
}
// ------------------------------------------------------------------------------------
// Writes Data to a Register of the AS1106/AS1107
// chip: Number of the controller chip (starting at 0 for the left)
// reg: Register of the controller
// data: Data to be written
void AS1107::WriteRegister( byte chip, byte reg, byte data)
{
if (chip >= 0 && chip < NbMod) {
digitalWrite(CS_Array[chip], LOW);
SPI.transfer(reg);
SPI.transfer(data);
digitalWrite(CS_Array[chip], HIGH);
}
}
Je n'ai pas testé le code, il doit y avoir des bugs, mais c'est juste pour te faire voir l'idée.
Le fait de passer de série en parallèle va augmenter ta vitesse de 500%, et tu dois avoir un gain du même ordre en passant d'une gestion logiciel à une gestion matériel.
a+