I've already written and tested some code using pigpio to drive a Futaba GP9002A VFD. When using the pigpio lib directly, it worked almost absolutely fine, but after migrating to the pigpio daemon (and replacing all pigpio API method calls with their respective counterparts in the pigpiod API, like spiOpen → spi_open
etc.), I started encountering random display errors like wrong characters and / or write positions. Here is how I call the pigpiod:
/usr/bin/pigpiod -lt 0
I've already messed around with the baudrate (lowering it to 50k and eventually to 32k) and the pigpiod sample rate, but the symptoms always remained the same. The hardware (electrical wiring) has not been changed BTW.
What can be the cause? A pigpio config error maybe? Do I have to take something special into account when running SPI through pigpiod? Thank you for any useful hints!
UPDATE: Here's the source code. I've added some simple execution time measurement to find out where any timing problems might occur. All you need here is a valid pigpiod and SPI handle:
void vfd::DisplayChar (char pos_x, char pos_y, char size_x, char size_y, string text)
{
char buffer [25];
unsigned int i = 0;
uint32_t tick = (uint32_t) 0;
string::iterator iter;
tick = get_current_tick (vfd::pigpiod_handle);
gpio_write (vfd::pigpiod_handle, CD_PIN, 1);
buffer [0] = vfd::Reverse (0x21); // Sets the starting point.
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
spi_write (vfd::pigpiod_handle, vfd::spi_handle, buffer, 1);
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
gpio_write (vfd::pigpiod_handle, CD_PIN, 0);
buffer [0] = vfd::Reverse (pos_x); // column
buffer [1] = vfd::Reverse (0x00);
buffer [2] = vfd::Reverse (pos_y); // row
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
spi_write (vfd::pigpiod_handle, vfd::spi_handle, buffer, 3);
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
gpio_write (vfd::pigpiod_handle, CD_PIN, 1);
buffer [0] = vfd::Reverse (0x22); // Sets the character size.
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
spi_write (vfd::pigpiod_handle, vfd::spi_handle, buffer, 1);
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
gpio_write (vfd::pigpiod_handle, CD_PIN, 0);
buffer [0] = vfd::Reverse (size_x); // horizontal scaling factor
buffer [1] = vfd::Reverse (size_y); // vertical scaling factor
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
spi_write (vfd::pigpiod_handle, vfd::spi_handle, buffer, 2);
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
gpio_write (vfd::pigpiod_handle, CD_PIN, 1);
buffer [0] = vfd::Reverse (0x20); // Makes the display write some text.
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
spi_write (vfd::pigpiod_handle, vfd::spi_handle, buffer, 1);
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
gpio_write (vfd::pigpiod_handle, CD_PIN, 0);
for (iter = text.begin (); iter != text.end (); iter++) {
buffer [i] = vfd::Reverse ((char) *iter);
i++;
}
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
spi_write (vfd::pigpiod_handle, vfd::spi_handle, buffer, i);
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
gpio_write (vfd::pigpiod_handle, CD_PIN, 1);
buffer [0] = vfd::Reverse (0x01); // Activates display buffer #1.
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
spi_write (vfd::pigpiod_handle, vfd::spi_handle, buffer, 1);
cout << "¤¤ " << get_current_tick (vfd::pigpiod_handle) - tick << " ¤¤" << endl;
}
These are the measurements (1 tick = 1 µsec):
¤¤ 214 ¤¤
¤¤ 815 ¤¤
¤¤ 1033 ¤¤
¤¤ 2119 ¤¤
¤¤ 2330 ¤¤
¤¤ 2853 ¤¤
¤¤ 3063 ¤¤
¤¤ 3865 ¤¤
¤¤ 4077 ¤¤
¤¤ 4604 ¤¤
¤¤ 4870 ¤¤
¤¤ 9337 ¤¤
¤¤ 10794 ¤¤
¤¤ 11320 ¤¤
UPDATE #2: After switching pigpiod verbosity on and recording its output (see the description stated in this answer), I get this log. Please note that the display uses GPIO #17 to switch between commands and data:
pi@autoradio:~ $ grep -e spi -e gpio pigerr.log
2018-12-07 23:06:25 gpioNotifyOpenInBand: fd=5
2018-12-07 23:06:25 gpioRead_Bits_0_31:
2018-12-07 23:06:25 gpioSetMode: gpio=27 mode=1
2018-12-07 23:06:25 gpioSetMode: gpio=25 mode=0
2018-12-07 23:06:25 gpioNotifyBegin: handle=0 bits=02000000
2018-12-07 23:06:25 spiOpen: spiChan=0 baud=50000 spiFlags=0x3
2018-12-07 23:06:25 gpioGetMode: gpio=8
2018-12-07 23:06:25 gpioGetMode: gpio=7
2018-12-07 23:06:25 gpioGetMode: gpio=11
2018-12-07 23:06:25 gpioGetMode: gpio=9
2018-12-07 23:06:25 gpioGetMode: gpio=10
2018-12-07 23:06:25 gpioSetMode: gpio=17 mode=1
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [E0]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [00]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [28]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [08]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [C8]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [48]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [00]
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [60]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [84]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 spiWrite: handle=0 count=3 [48 00 68]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [44]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 spiWrite: handle=0 count=2 [00 00]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [04]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 spiWrite: handle=0 count=15 [72 F6 04 2E 96 B6 A6 04 CE 96 E6 76 86 36 84]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [80]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [84]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 spiWrite: handle=0 count=3 [08 00 84]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [44]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 spiWrite: handle=0 count=2 [00 00]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [04]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=0
2018-12-07 23:06:29 spiWrite: handle=0 count=16 [CA EE 96 2E C6 16 04 F6 76 04 4E 86 26 96 F6 74]
2018-12-07 23:06:29 gpioWrite: gpio=17 level=1
2018-12-07 23:06:29 spiWrite: handle=0 count=1 [80]
2018-12-07 23:06:30 gpioWrite: gpio=17 level=1
2018-12-07 23:06:30 spiWrite: handle=0 count=1 [00]
2018-12-07 23:06:30 spiWrite: handle=0 count=1 [60]
2018-12-07 23:06:30 gpioWrite: gpio=17 level=0
2018-12-07 23:06:30 gpioWrite: gpio=17 level=1
2018-12-07 23:06:30 spiWrite: handle=0 count=1 [00]
2018-12-07 23:06:30 spiWrite: handle=0 count=1 [60]
2018-12-07 23:06:30 gpioWrite: gpio=17 level=0
2018-12-07 23:06:30 gpioWrite: gpio=17 level=1
2018-12-07 23:06:30 spiWrite: handle=0 count=1 [E0]
2018-12-07 23:06:30 gpioWrite: gpio=17 level=0
2018-12-07 23:06:30 spiWrite: handle=0 count=1 [80]
2018-12-07 23:06:31 gpioWrite: gpio=27 level=0
2018-12-07 23:06:32 gpioWrite: gpio=27 level=0
2018-12-07 23:06:32 spiClose: handle=0
2018-12-07 23:06:32 gpioNotifyClose: handle=0
These readings are always the same, no matter whether the VFD display the text correctly, or not.
it worked almost absolutely fine
................ there may be a bug in your code that has surfaced as a result of the migration