change for GEII project NICE (invert cs)
Diff: max7219.cpp
- Revision:
- 0:798fb343e022
- Child:
- 1:90a7cf4e7d26
diff -r 000000000000 -r 798fb343e022 max7219.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/max7219.cpp Tue Jan 12 23:40:36 2016 +0000 @@ -0,0 +1,552 @@ +/******************************************************************//** +* @file max7219.cpp +* +* @author Justin Jordan +* +* @version 0.0 +* +* Started: 08JAN16 +* +* Updated: +* +* @brief Source file for Max7219 class +*********************************************************************** +* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES +* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +* OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of Maxim Integrated +* Products, Inc. shall not be used except as stated in the Maxim Integrated +* Products, Inc. Branding Policy. +* +* The mere transfer of this software does not imply any licenses +* of trade secrets, proprietary technology, copyrights, patents, +* trademarks, maskwork rights, or any other form of intellectual +* property whatsoever. Maxim Integrated Products, Inc. retains all +* ownership rights. +**********************************************************************/ + + +#include "max7219.h" + + +//********************************************************************* +Max7219::Max7219(SPI *spi_bus, PinName cs): _p_spi(spi_bus) +{ + _num_devices = 1; + + _p_cs = new DigitalOut(cs, 1); + _spi_owner = false; +} + + +//********************************************************************* +Max7219::Max7219(PinName mosi, PinName miso, PinName sclk, PinName cs) +{ + _num_devices = 1; + + _p_spi = new SPI(mosi, miso, sclk); + _p_cs = new DigitalOut(cs, 1); + + _spi_owner = true; +} + + +//********************************************************************* +Max7219::~Max7219() +{ + delete _p_cs; + + if(_spi_owner) + { + delete _p_spi; + } +} + + +//********************************************************************* +int32_t Max7219::set_num_devices(uint8_t num_devices) +{ + int32_t rtn_val = -1; + + if(num_devices > 0) + { + _num_devices = num_devices; + rtn_val = _num_devices; + } + + return(rtn_val); +} + + +//********************************************************************* +void Max7219::set_display_test(void) +{ + uint8_t idx = 0; + + _p_cs->write(0); + for(idx = 0; idx < _num_devices; idx++) + { + _p_spi->write(MAX7219_DISPLAY_TEST); + _p_spi->write(1); + } + _p_cs->write(1); +} + + +//********************************************************************* +void Max7219::clear_display_test(void) +{ + uint8_t idx = 0; + + _p_cs->write(0); + for(idx = 0; idx < _num_devices; idx++) + { + _p_spi->write(MAX7219_DISPLAY_TEST); + _p_spi->write(0); + } + _p_cs->write(1); +} + + +//********************************************************************* +int32_t Max7219::init_device(max7219_configuration_t config, uint8_t device_number) +{ + int32_t rtn_val = -1; + uint8_t idx = 0; + + if(config.device_number > _num_devices) + { + rtn_val = -1; + } + else if(config.device_number == 0) + { + //device numbering starts with index 1 + rtn_val = -2; + } + else + { + //write DECODE_MODE register of device + _p_cs->write(0); + for(idx = _num_devices; idx > 0; idx--) + { + if(config.device_number == idx) + { + _p_spi->write(MAX7219_DECODE_MODE); + _p_spi->write(config.decode_mode); + } + else + { + _p_spi->write(MAX7219_NO_OP); + _p_spi->write(0); + } + } + _p_cs->write(1); + + wait_us(1); + + //write INTENSITY register of device + _p_cs->write(0); + for(idx = _num_devices; idx > 0; idx--) + { + if(config.device_number == idx) + { + _p_spi->write(MAX7219_INTENSITY); + _p_spi->write(config.intensity); + } + else + { + _p_spi->write(MAX7219_NO_OP); + _p_spi->write(0); + } + } + _p_cs->write(1); + + wait_us(1); + + //write SCAN_LIMT register of device + _p_cs->write(0); + for(idx = _num_devices; idx > 0; idx--) + { + if(config.device_number == idx) + { + _p_spi->write(MAX7219_SCAN_LIMIT); + _p_spi->write(config.scan_limit); + } + else + { + _p_spi->write(MAX7219_NO_OP); + _p_spi->write(0); + } + } + _p_cs->write(1); + + wait_us(1); + + rtn_val = 0; + } + + return(rtn_val); +} + + +//********************************************************************* +void Max7219::init_display(max7219_configuration_t config) +{ + uint8_t idx = 0; + + //write DECODE_MODE register of all devices + _p_cs->write(0); + for(idx = 0; idx < _num_devices; idx++) + { + _p_spi->write(MAX7219_DECODE_MODE); + _p_spi->write(config.decode_mode); + } + _p_cs->write(1); + + wait_us(1); + + //write INTENSITY register of all devices + _p_cs->write(0); + for(idx = 0; idx < _num_devices; idx++) + { + _p_spi->write(MAX7219_INTENSITY); + _p_spi->write(config.intensity); + } + _p_cs->write(1); + + wait_us(1); + + //write SCAN_LIMT register of all devices + _p_cs->write(0); + for(idx = 0; idx < _num_devices; idx++) + { + _p_spi->write(MAX7219_SCAN_LIMIT); + _p_spi->write(config.scan_limit); + } + _p_cs->write(1); + + wait_us(1); +} + + +//********************************************************************* +int32_t Max7219::enable_device(uint8_t device_number) +{ + int32_t rtn_val = -1; + uint8_t idx = 0; + + if(device_number > _num_devices) + { + rtn_val = -1; + } + else if(device_number == 0) + { + //device numbering starts with index 1 + rtn_val = -2; + } + else + { + _p_cs->write(0); + for(idx = _num_devices; idx > 0; idx--) + { + if(device_number == idx) + { + _p_spi->write(MAX7219_SHUTDOWN); + _p_spi->write(1); + } + else + { + _p_spi->write(MAX7219_NO_OP); + _p_spi->write(0); + } + } + _p_cs->write(1); + + rtn_val = 0; + } + + return(rtn_val); +} + + +//********************************************************************* +void Max7219::enable_display(void) +{ + uint8_t idx = 0; + + _p_cs->write(0); + for(idx = 0; idx < _num_devices; idx++) + { + _p_spi->write(MAX7219_SHUTDOWN); + _p_spi->write(1); + } + _p_cs->write(1); +} + + +//********************************************************************* +int32_t Max7219::disable_device(uint8_t device_number) +{ + int32_t rtn_val = -1; + uint8_t idx = 0; + + if(device_number > _num_devices) + { + rtn_val = -1; + } + else if(device_number == 0) + { + //device numbering starts with index 1 + rtn_val = -2; + } + else + { + _p_cs->write(0); + for(idx = _num_devices; idx > 0; idx--) + { + if(device_number == idx) + { + _p_spi->write(MAX7219_SHUTDOWN); + _p_spi->write(0); + } + else + { + _p_spi->write(MAX7219_NO_OP); + _p_spi->write(0); + } + } + _p_cs->write(1); + + rtn_val = 0; + } + + return(rtn_val); +} + + +//********************************************************************* +void Max7219::disable_display(void) +{ + uint8_t idx = 0; + + _p_cs->write(0); + for(idx = 0; idx < _num_devices; idx++) + { + _p_spi->write(MAX7219_SHUTDOWN); + _p_spi->write(0); + } + _p_cs->write(1); +} + + + +//********************************************************************* +int32_t Max7219::write_digit(uint8_t device_number, uint8_t digit, uint8_t data) +{ + int32_t rtn_val = -1; + uint8_t idx = 0; + + if(digit > MAX7219_DIGIT_7) + { + rtn_val = -3; + } + else if(digit < MAX7219_DIGIT_0) + { + rtn_val = -4; + } + else + { + if(device_number > _num_devices) + { + rtn_val = -1; + } + else if(device_number == 0) + { + rtn_val = -2; + } + else + { + _p_cs->write(0); + for(idx = _num_devices; idx > 0; idx--) + { + if(idx == device_number) + { + _p_spi->write(digit); + _p_spi->write(data); + } + else + { + _p_spi->write(MAX7219_NO_OP); + _p_spi->write(0); + } + } + _p_cs->write(1); + + rtn_val = 0; + } + } + + return(rtn_val); +} + + +//********************************************************************* +int32_t Max7219::clear_digit(uint8_t device_number, uint8_t digit) +{ + int32_t rtn_val = -1; + uint8_t idx = 0; + + if(digit > MAX7219_DIGIT_7) + { + rtn_val = -3; + } + else if(digit < MAX7219_DIGIT_0) + { + rtn_val = -4; + } + else + { + if(device_number > _num_devices) + { + rtn_val = -1; + } + else if(device_number == 0) + { + rtn_val = -2; + } + else + { + _p_cs->write(0); + for(idx = _num_devices; idx > 0; idx--) + { + if(idx == device_number) + { + _p_spi->write(digit); + _p_spi->write(0); + } + else + { + _p_spi->write(MAX7219_NO_OP); + _p_spi->write(0); + } + } + _p_cs->write(1); + + rtn_val = 0; + } + } + + return(rtn_val); +} + + +//********************************************************************* +int32_t Max7219::device_all_on(uint8_t device_number) +{ + int32_t rtn_val = -1; + uint8_t idx = 0; + + if(device_number > _num_devices) + { + rtn_val = -1; + } + else if(device_number == 0) + { + rtn_val = -2; + } + else + { + rtn_val = 0; + + //writes every digit of given device to 0xFF + for(idx = 0; idx < 8; idx++) + { + if(rtn_val == 0) + { + rtn_val = write_digit(device_number, (idx + 1), 0xFF); + } + } + } + + return(rtn_val); +} + + +//********************************************************************* +int32_t Max7219::device_all_off(uint8_t device_number) +{ + int32_t rtn_val = -1; + uint8_t idx = 0; + + if(device_number > _num_devices) + { + rtn_val = -1; + } + else if(device_number == 0) + { + rtn_val = -2; + } + else + { + rtn_val = 0; + + //writes every digit of given device to 0 + for(idx = 0; idx < 8; idx++) + { + if(rtn_val == 0) + { + rtn_val = write_digit(device_number, (idx + 1), 0); + } + } + } + + return(rtn_val); +} + + +void Max7219::display_all_on(void) +{ + uint8_t idx, idy; + + //writes every digit of every device to 0xFF + for(idx = 0; idx < _num_devices; idx++) + { + for(idy = 0; idy < MAX7219_DIGIT_7; idy++) + { + write_digit((idx + 1), (idy + 1), 0xFF); + } + } +} + + +void Max7219::display_all_off(void) +{ + uint8_t idx, idy; + + //writes every digit of every device to 0 + for(idx = 0; idx < _num_devices; idx++) + { + for(idy = 0; idy < MAX7219_DIGIT_7; idy++) + { + write_digit((idx + 1), (idy + 1), 0); + } + } +} +