The iPod controller that I submitted for the mbed challenge

Dependencies:   mbed Motordriver PID

Committer:
networker
Date:
Wed May 04 15:41:13 2011 +0000
Revision:
0:371773dd3dd1
first publication

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 0:371773dd3dd1 1 /* MCP23017 - drive the Microchip MCP23017 16-bit Port Extender using I2C
networker 0:371773dd3dd1 2 * Copyright (c) 2010 Wim Huiskamp, Romilly Cocking (original version for SPI)
networker 0:371773dd3dd1 3 *
networker 0:371773dd3dd1 4 * Released under the MIT License: http://mbed.org/license/mit
networker 0:371773dd3dd1 5 *
networker 0:371773dd3dd1 6 * version 0.2 Initial Release
networker 0:371773dd3dd1 7 * version 0.3 Cleaned up
networker 0:371773dd3dd1 8 */
networker 0:371773dd3dd1 9 #include "mbed.h"
networker 0:371773dd3dd1 10
networker 0:371773dd3dd1 11 #ifndef MCP23017_H
networker 0:371773dd3dd1 12 #define MCP23017_H
networker 0:371773dd3dd1 13
networker 0:371773dd3dd1 14 // All register addresses assume IOCON.BANK = 0 (POR default)
networker 0:371773dd3dd1 15 #define IODIRA 0x00
networker 0:371773dd3dd1 16 #define IODIRB 0x01
networker 0:371773dd3dd1 17 #define GPINTENA 0x04
networker 0:371773dd3dd1 18 #define GPINTENB 0x05
networker 0:371773dd3dd1 19 #define DEFVALA 0x06
networker 0:371773dd3dd1 20 #define DEFVALB 0x07
networker 0:371773dd3dd1 21 #define INTCONA 0x08
networker 0:371773dd3dd1 22 #define INTCONB 0x09
networker 0:371773dd3dd1 23 #define IOCON 0x0A
networker 0:371773dd3dd1 24 //#define IOCON 0x0B
networker 0:371773dd3dd1 25 #define GPPUA 0x0C
networker 0:371773dd3dd1 26 #define GPPUB 0x0D
networker 0:371773dd3dd1 27 #define INTFA 0x0E
networker 0:371773dd3dd1 28 #define INTFB 0x0F
networker 0:371773dd3dd1 29 #define INTCAPA 0x10
networker 0:371773dd3dd1 30 #define INTCAPB 0x11
networker 0:371773dd3dd1 31 #define GPIOA 0x12
networker 0:371773dd3dd1 32 #define GPIOB 0x13
networker 0:371773dd3dd1 33 #define OLATA 0x14
networker 0:371773dd3dd1 34 #define OLATB 0x15
networker 0:371773dd3dd1 35
networker 0:371773dd3dd1 36 // Control settings
networker 0:371773dd3dd1 37 #define IOCON_BANK 0x80 // Banked registers for Port A and B
networker 0:371773dd3dd1 38 #define IOCON_BYTE_MODE 0x20 // Disables sequential operation, Address Ptr does not increment
networker 0:371773dd3dd1 39 // If Disabled and Bank = 0, operations toggle between Port A and B registers
networker 0:371773dd3dd1 40 #define IOCON_HAEN 0x08 // Hardware address enable
networker 0:371773dd3dd1 41 #define IOCON_ODR 0x04 // Open drain, also disables int polarity!
networker 0:371773dd3dd1 42 #define INTERRUPT_POLARITY_BIT 0x02
networker 0:371773dd3dd1 43 #define INTERRUPT_MIRROR_BIT 0x40
networker 0:371773dd3dd1 44
networker 0:371773dd3dd1 45 #define PORT_DIR_OUT 0x00
networker 0:371773dd3dd1 46 #define PORT_DIR_IN 0xFF
networker 0:371773dd3dd1 47
networker 0:371773dd3dd1 48 enum Polarity { ACTIVE_LOW , ACTIVE_HIGH };
networker 0:371773dd3dd1 49 enum Port { PORT_A, PORT_B };
networker 0:371773dd3dd1 50
networker 0:371773dd3dd1 51 extern DigitalOut Busy;
networker 0:371773dd3dd1 52
networker 0:371773dd3dd1 53 class MCP23017 {
networker 0:371773dd3dd1 54 FunctionPointer fp;
networker 0:371773dd3dd1 55 bool posted;
networker 0:371773dd3dd1 56 public:
networker 0:371773dd3dd1 57 /** Create an MCP23017 object connected to the specified I2C object and using the specified deviceAddress
networker 0:371773dd3dd1 58 *
networker 0:371773dd3dd1 59 * @param I2C &i2c the I2C port to connect to
networker 0:371773dd3dd1 60 * @param char deviceAddress the address of the MSC23017
networker 0:371773dd3dd1 61 */
networker 0:371773dd3dd1 62 MCP23017(I2C &i2c, char deviceAddress);
networker 0:371773dd3dd1 63 MCP23017(const MCP23017& m):_i2c(m._i2c) {
networker 0:371773dd3dd1 64 printf("copy constructor\n");
networker 0:371773dd3dd1 65 }
networker 0:371773dd3dd1 66
networker 0:371773dd3dd1 67 /** Set I/O direction of specified MCP23017 Port
networker 0:371773dd3dd1 68 *
networker 0:371773dd3dd1 69 * @param Port Port address (Port_A or Port_B)
networker 0:371773dd3dd1 70 * @param char direction pin direction (0 = output, 1 = input)
networker 0:371773dd3dd1 71 */
networker 0:371773dd3dd1 72 void direction(Port port, char direction);
networker 0:371773dd3dd1 73
networker 0:371773dd3dd1 74 /** Set Pull-Up Resistors on specified MCP23017 Port
networker 0:371773dd3dd1 75 *
networker 0:371773dd3dd1 76 * @param Port Port address (Port_A or Port_B)
networker 0:371773dd3dd1 77 * @param char offOrOn per pin (0 = off, 1 = on)
networker 0:371773dd3dd1 78 */
networker 0:371773dd3dd1 79 void configurePullUps(Port port, char offOrOn);
networker 0:371773dd3dd1 80
networker 0:371773dd3dd1 81 void interruptEnable(Port port, char interruptsEnabledMask);
networker 0:371773dd3dd1 82 void interruptPolarity(Polarity polarity);
networker 0:371773dd3dd1 83 void mirrorInterrupts(bool mirror);
networker 0:371773dd3dd1 84 void defaultValue(Port port, char valuesToCompare);
networker 0:371773dd3dd1 85 void interruptControl(Port port, char interruptControlBits);
networker 0:371773dd3dd1 86
networker 0:371773dd3dd1 87 /** Read from specified MCP23017 Port
networker 0:371773dd3dd1 88 *
networker 0:371773dd3dd1 89 * @param Port Port address (Port_A or Port_B)
networker 0:371773dd3dd1 90 * @returns data from Port
networker 0:371773dd3dd1 91 */
networker 0:371773dd3dd1 92 char read(Port port);
networker 0:371773dd3dd1 93 int readW(char address);
networker 0:371773dd3dd1 94 /** Write to specified MCP23017 Port
networker 0:371773dd3dd1 95 *
networker 0:371773dd3dd1 96 * @param Port Port address (Port_A or Port_B)
networker 0:371773dd3dd1 97 * @param char byte data to write
networker 0:371773dd3dd1 98 */
networker 0:371773dd3dd1 99 void write(Port port, char byte);
networker 0:371773dd3dd1 100 void write(Port port, const char *buffer, int len, bool rpt=false);
networker 0:371773dd3dd1 101 enum i2c_status { i2c_ok, i2c_busy, i2c_nack, i2c_pending};
networker 0:371773dd3dd1 102 i2c_status _read(char reg, char *data, int size);
networker 0:371773dd3dd1 103 i2c_status _write(char *data, int size, bool rpt = false);//first element of data is the register address
networker 0:371773dd3dd1 104 bool testbusy() {
networker 0:371773dd3dd1 105 __disable_irq();
networker 0:371773dd3dd1 106 if (busy) {
networker 0:371773dd3dd1 107 __enable_irq();
networker 0:371773dd3dd1 108 return true;
networker 0:371773dd3dd1 109 }
networker 0:371773dd3dd1 110 busy = true;
networker 0:371773dd3dd1 111 Busy = 1;
networker 0:371773dd3dd1 112 __enable_irq();
networker 0:371773dd3dd1 113 return false;
networker 0:371773dd3dd1 114 }
networker 0:371773dd3dd1 115 bool isbusy() {
networker 0:371773dd3dd1 116 return busy;
networker 0:371773dd3dd1 117 }
networker 0:371773dd3dd1 118 void releasebusy() {
networker 0:371773dd3dd1 119 busy = false;
networker 0:371773dd3dd1 120 Busy = 0;
networker 0:371773dd3dd1 121 if (posted) {
networker 0:371773dd3dd1 122 posted = false;
networker 0:371773dd3dd1 123 fp.call();
networker 0:371773dd3dd1 124 }
networker 0:371773dd3dd1 125 }
networker 0:371773dd3dd1 126 template<typename T>
networker 0:371773dd3dd1 127 void post(T *object, void (T::*member)()) {
networker 0:371773dd3dd1 128 if (posted)
networker 0:371773dd3dd1 129 return;
networker 0:371773dd3dd1 130 fp.attach(object, member);
networker 0:371773dd3dd1 131 posted = true;
networker 0:371773dd3dd1 132 }
networker 0:371773dd3dd1 133 protected:
networker 0:371773dd3dd1 134 I2C &_i2c;
networker 0:371773dd3dd1 135 char _readOpcode;
networker 0:371773dd3dd1 136 char _writeOpcode;
networker 0:371773dd3dd1 137 bool busy;
networker 0:371773dd3dd1 138
networker 0:371773dd3dd1 139 /** Init MCP23017
networker 0:371773dd3dd1 140 *
networker 0:371773dd3dd1 141 * @param
networker 0:371773dd3dd1 142 * @returns
networker 0:371773dd3dd1 143 */
networker 0:371773dd3dd1 144 void _init();
networker 0:371773dd3dd1 145
networker 0:371773dd3dd1 146 /** Write to specified MCP23017 register
networker 0:371773dd3dd1 147 *
networker 0:371773dd3dd1 148 * @param char address the internal registeraddress of the MSC23017
networker 0:371773dd3dd1 149 */
networker 0:371773dd3dd1 150 void _write(char address, char byte);
networker 0:371773dd3dd1 151
networker 0:371773dd3dd1 152 /** Read from specified MCP23017 register
networker 0:371773dd3dd1 153 *
networker 0:371773dd3dd1 154 * @param char address the internal registeraddress of the MSC23017
networker 0:371773dd3dd1 155 * @returns data from register
networker 0:371773dd3dd1 156 */
networker 0:371773dd3dd1 157 short _read(char address);
networker 0:371773dd3dd1 158 };
networker 0:371773dd3dd1 159
networker 0:371773dd3dd1 160 #endif