|
|
View previous topic :: View next topic |
Author |
Message |
aaronik19
Joined: 25 Apr 2011 Posts: 297
|
MCP23008 |
Posted: Mon Oct 10, 2011 3:12 pm |
|
|
Dear All,
I am using about 4 IO Expander on one single I2C bus. The configuration is below:
Code: |
// MCP008 REGISTERS
#define _IODIR 0x00
#define _IPOL 0x01
#define _GPINTEN 0x02
#define _DEFVAL 0x03
#define _INTCON 0x04
#define _IOCON 0x05
#define _GPPU 0x06
#define _INTF 0x07
#define _INTCAP 0x08
#define _GPIO 0x09
#define _OLAT 0x0A
void init_MCP23008() {
output_float(PIN_B1);
output_float(PIN_B0);
delay_ms(250);
}
void write_MCP23008(unsigned char WriteAddress, unsigned char cmdByte, unsigned char data)
{
i2c_start(); // start condition
delay_us(20);
i2c_write(WriteAddress); // Send slave address and clear (R/W_)
delay_us(20);
i2c_write(cmdByte); // Command byte and register to be written.
delay_us(20);
i2c_write(data); // First data byte pair as per command byte(cmd)
delay_us(20);
i2c_stop(); // stop condition
delay_us(50);
}
long int read_MCP23008(unsigned int WriteAddress, unsigned int cmdByte, unsigned int ReadAddress)
{
unsigned int data;
i2c_start(); // start condition
delay_us(20);
i2c_write(WriteAddress); // Send slave address and clear (R/W_)
delay_us(20);
i2c_write(cmdByte); // Command byte and register to be written.
delay_us(50);
i2c_start();
delay_us(20); // restart condition
i2c_write(ReadAddress); // Send slave address and clear (R_/W)
delay_us(20);
data = i2c_read(0); // Data from LSB or MSB of register
delay_us(20);
i2c_stop(); // stop condition
return(data);
} |
and the main program is this:
Code: |
#include "i2c.c"
#define MCP23008_write_add 0x40
#define MCP23008_read_add 0x41
void main()
{
write_MCP23008(0x01, _IODIR, 0x00);
write_MCP23008(0x02, _IODIR, 0xFF);
write_MCP23008(MCP23008_write_add, _IPOL, 0x00);
write_MCP23008(MCP23008_write_add, _IOCON, 0x00);
init_mcp23008();
while(1)
{
write_MCP23008(0x01,0x09, 0x01);
delay_ms(3000);
write_MCP23008(0x02,0x09, 0x02);
delay_ms(3000);
write_MCP23008(0x03,0x09, 0x03);
delay_ms(3000);
write_MCP23008(0x04,0x09, 0x04);
}
}
|
now I have the 4 IO Expander from address 0x01 to 0x04. When I am reading I am getting always 0xff. I am making something wrong? Thanks for your help to solve this issue. I am using PIC18F4550 with 20MHz crystal. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Oct 10, 2011 4:26 pm |
|
|
Quote: | #define MCP23008_write_add 0x40
#define MCP23008_read_add 0x41
now I have the 4 IO Expander from address 0x01 to 0x04
|
The addresses of 0x40 and 0x41 are for your first MCP23008.
The sub-address of each separate MCP23008 chip is contained in the
control byte. It's defined by 3 bits (A0, A1, A2).
Download the MCP23008 data sheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/21919d.pdf
Look at Figure 1-2 at the top right of page 8. You can see how if
the chip had a sub-address of 0 (A0, A1, A2 all connected to ground)
then the chip would have an i2c address of 0x40 (and 0x41 for reading).
So, you need to #define the control bytes for the other 3 MCP23008
chips. Look at the bit diagram and decide how to do it. Then write
the new #define statements. Then use those in your code to talk
to the specified chip. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|