Fix to have load pin working with SPI1.

Dependencies:   mbed

Fork of Max7221 by Dwayne Dilbeck

Committer:
ky3orr
Date:
Mon Nov 23 11:28:44 2015 +0000
Revision:
7:a160cb7cdd86
Parent:
6:191569a26f50
Child:
8:3f5901f2f813
Code refactored to have MAX7219/7221 driver only with SPI chain support.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jakowisp 2:828c62cc1861 1 /**
jakowisp 2:828c62cc1861 2 * @file Max7221.cpp
ky3orr 7:a160cb7cdd86 3 * @brief MAX7219/7221 driver class.
jakowisp 2:828c62cc1861 4 *
ky3orr 7:a160cb7cdd86 5 * @author Grzegorz Kaczmarek
ky3orr 7:a160cb7cdd86 6 * @comment Code inspired on erlier Dwayne S. Dilbeck's work
ky3orr 7:a160cb7cdd86 7 * @date 20/11/2015
jakowisp 2:828c62cc1861 8 */
ky3orr 7:a160cb7cdd86 9
jakowisp 1:d8589d1f368c 10 #include "mbed.h"
jakowisp 1:d8589d1f368c 11 #include "Max7221.h"
jakowisp 1:d8589d1f368c 12
ky3orr 7:a160cb7cdd86 13 Max7221::Max7221(SPI *spi, DigitalOut *cs, unsigned int position) :
ky3orr 7:a160cb7cdd86 14 mp_spi(spi),
ky3orr 7:a160cb7cdd86 15 mp_cs(cs),
ky3orr 7:a160cb7cdd86 16 m_position(position)
ky3orr 7:a160cb7cdd86 17 {
jakowisp 1:d8589d1f368c 18 }
jakowisp 1:d8589d1f368c 19
ky3orr 7:a160cb7cdd86 20 void Max7221::CsLow()
ky3orr 7:a160cb7cdd86 21 {
ky3orr 7:a160cb7cdd86 22 if(mp_cs != NULL) {
ky3orr 7:a160cb7cdd86 23 *mp_cs = LOG_0;
jakowisp 1:d8589d1f368c 24 }
jakowisp 1:d8589d1f368c 25 }
jakowisp 1:d8589d1f368c 26
ky3orr 7:a160cb7cdd86 27 void Max7221::CsHigh()
ky3orr 7:a160cb7cdd86 28 {
ky3orr 7:a160cb7cdd86 29 if(mp_cs != NULL) {
ky3orr 7:a160cb7cdd86 30 *mp_cs = LOG_1;
jakowisp 1:d8589d1f368c 31 }
jakowisp 1:d8589d1f368c 32 }
jakowisp 1:d8589d1f368c 33
ky3orr 7:a160cb7cdd86 34 void Max7221::WriteRaw(unsigned int reg, unsigned int data) {
ky3orr 7:a160cb7cdd86 35 if(mp_spi != NULL) {
ky3orr 7:a160cb7cdd86 36 mp_spi->write(reg);
ky3orr 7:a160cb7cdd86 37 mp_spi->write(data);
jakowisp 1:d8589d1f368c 38 }
jakowisp 1:d8589d1f368c 39 }
ky3orr 7:a160cb7cdd86 40
ky3orr 7:a160cb7cdd86 41 void Max7221::Write(unsigned int reg, unsigned int data) {
ky3orr 7:a160cb7cdd86 42 unsigned int i;
ky3orr 7:a160cb7cdd86 43
ky3orr 7:a160cb7cdd86 44 CsLow();
ky3orr 7:a160cb7cdd86 45 WriteRaw(reg, data);
ky3orr 7:a160cb7cdd86 46 if(m_position > 0) {
ky3orr 7:a160cb7cdd86 47 i = m_position;
ky3orr 7:a160cb7cdd86 48 while(i--) {
ky3orr 7:a160cb7cdd86 49 WriteRaw(max7219_reg_noop, 0x0);
ky3orr 7:a160cb7cdd86 50 }
ky3orr 7:a160cb7cdd86 51 }
ky3orr 7:a160cb7cdd86 52 CsHigh();
ky3orr 7:a160cb7cdd86 53 }
ky3orr 7:a160cb7cdd86 54
ky3orr 7:a160cb7cdd86 55 void Max7221::TestMode(bool mode) {
ky3orr 7:a160cb7cdd86 56 if(mode) {
ky3orr 7:a160cb7cdd86 57 Write(max7219_reg_displayTest, 0x01);
ky3orr 7:a160cb7cdd86 58 } else {
ky3orr 7:a160cb7cdd86 59 Write(max7219_reg_displayTest, 0x00);
ky3orr 7:a160cb7cdd86 60 }
ky3orr 7:a160cb7cdd86 61 }
ky3orr 7:a160cb7cdd86 62
ky3orr 7:a160cb7cdd86 63 void Max7221::UseDigitsNo(unsigned int digits_no) {
ky3orr 7:a160cb7cdd86 64 if((digits_no > 0) && (digits_no < 9)) {
ky3orr 7:a160cb7cdd86 65 Write(max7219_reg_scanLimit, (digits_no - 1));
ky3orr 7:a160cb7cdd86 66 }
ky3orr 7:a160cb7cdd86 67 }
ky3orr 7:a160cb7cdd86 68
ky3orr 7:a160cb7cdd86 69 void Max7221::DecodeMode(unsigned int mode) {
ky3orr 7:a160cb7cdd86 70 Write(max7219_reg_decodeMode, mode);
jakowisp 1:d8589d1f368c 71 }
jakowisp 1:d8589d1f368c 72
ky3orr 7:a160cb7cdd86 73 void Max7221::WriteDigit(unsigned int digit_no, unsigned int value) {
ky3orr 7:a160cb7cdd86 74 if(digit_no < 8) {
ky3orr 7:a160cb7cdd86 75 Write(digit_no, value);
ky3orr 7:a160cb7cdd86 76 }
ky3orr 7:a160cb7cdd86 77 }
jakowisp 1:d8589d1f368c 78
ky3orr 7:a160cb7cdd86 79 void Max7221::Intensity(unsigned int intensity) {
ky3orr 7:a160cb7cdd86 80 if(intensity > 0x0F) {
ky3orr 7:a160cb7cdd86 81 intensity = 0x0F;
ky3orr 7:a160cb7cdd86 82 }
ky3orr 7:a160cb7cdd86 83 Write(max7219_reg_intensity, intensity);
jakowisp 1:d8589d1f368c 84 }
jakowisp 1:d8589d1f368c 85
ky3orr 7:a160cb7cdd86 86 void Max7221::OperationMode(bool mode) {
ky3orr 7:a160cb7cdd86 87 if(mode) {
ky3orr 7:a160cb7cdd86 88 Write(max7219_reg_shutdown, 0x01);
ky3orr 7:a160cb7cdd86 89 } else {
ky3orr 7:a160cb7cdd86 90 Write(max7219_reg_shutdown, 0x00);
jakowisp 1:d8589d1f368c 91 }
jakowisp 1:d8589d1f368c 92 }
jakowisp 2:828c62cc1861 93
ky3orr 7:a160cb7cdd86 94 void Max7221::Setup () {
ky3orr 7:a160cb7cdd86 95 unsigned int i;
ky3orr 7:a160cb7cdd86 96
ky3orr 7:a160cb7cdd86 97 TestMode(false); // Disable display test
ky3orr 7:a160cb7cdd86 98 UseDigitsNo(8); // Use all 8 digits
ky3orr 7:a160cb7cdd86 99 DecodeMode(0xFF); // Turn on Code B font decode for all digits
ky3orr 7:a160cb7cdd86 100 for(i=1;i<9;i++) { // Clean all digits
ky3orr 7:a160cb7cdd86 101 WriteDigit(i, 0x0F);
ky3orr 7:a160cb7cdd86 102 }
ky3orr 7:a160cb7cdd86 103 Intensity(0x01); // Set lowest display intensity(0x00-0xFF)
ky3orr 7:a160cb7cdd86 104 OperationMode(true); // Enable operation mode
ky3orr 7:a160cb7cdd86 105 }