- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I'd like to build a PCB to hold an -059 board, and some I2C sensors. Will I have a problem if I connect my I2C bus to the lines at P12_0 and P12_1? Or is the master function on the bridge chip normally disabled, allowing me to take full control of the bus with the PSoC 5LP? Is there any advantage/disadvantage to using those pins for my own design (e.g. allowing me to debug my slave devices using the bridge)?
Thanks!
Larry
Solved! Go to Solution.
- Labels:
-
PSoC 5LP
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
After posting the previous response I became anxious as I could not remember if I have ever used 12[0]/12[1] with CY8CKIT-059.
At the first glance, the silk print on the P12[0] and P12[1] are written 12.0 SCL and 12.1 SDA, so it was promising.
I dug out my old I2C sample project and opened, there I was using P3[0] and P3[1].
So I modified those pins to P12[0] and P12[1] and tested with LM75B (temperature sensor) as below.
And fortunately it seems to be working (^ ^)
Tera Term Log
Note: After starting the program, I touched the sensor for a while after it reached to 32 I released my finger.
schematic
Note: The sample was used to test I2C reset so the I2C component has explicit pins but usually it's not necessary.
pins
main.c
=================
#include "project.h"
#include "stdio.h"
#define LM75B_I2C_SLAVE_ADDR (0x48)
char str[128] ; /* print buffer */
void print(char *str)
{
UART_PutString(str) ;
}
void cls(void)
{
print("\033c") ; /* reset */
CyDelay(20) ;
print("\033[2J") ; /* clear screen */
CyDelay(20) ;
}
void splash(void)
{
cls() ;
sprintf(str, "PSoC 5LPI2C I2C (LM75B) Test (%s %s)\n", __DATE__, __TIME__) ;
print(str) ;
}
void init_hardware(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
UART_Start() ;
splash() ;
I2C_Start() ;
}
uint8_t myI2C_ReadByte(uint8_t reg_addr)
{
uint8_t status ;
uint8_t value = 0 ;
I2C_MasterClearStatus();
status = I2C_MasterSendStart(LM75B_I2C_SLAVE_ADDR, I2C_WRITE_XFER_MODE) ;
if (I2C_MSTR_NO_ERROR == status) {
I2C_MasterWriteByte(reg_addr);
status = I2C_MasterSendRestart(LM75B_I2C_SLAVE_ADDR, I2C_READ_XFER_MODE);
}
if (I2C_MSTR_NO_ERROR == status) {
value = I2C_MasterReadByte(I2C_ACK_DATA); // read manufacturers ID from device
}
I2C_MasterSendStop();
return(value) ;
}
int main(void)
{
uint8_t data ;
uint8_t addr = 0 ;
int i ;
init_hardware() ;
splash() ;
for(;;)
{
for (i = 0 ; i < 5 ; i++ ) {
data = myI2C_ReadByte(addr) ;
sprintf(str, "%d\n", data) ;
print(str) ;
CyDelay(1000) ;
}
}
}
=================
moto
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
As I2C bus is open-drain multi-drop type bus,
I think that your program can take full control over the bus as far as the bridge control is not used.
IMHO
Disadvantage:
Added load on the bus as KitProg's I2C bus is also connected.
Advantage:
I think you can use the bridge control to test I2C devices on the bus even before your program starts controlling the bus.
(Note: I've never tested this functionality before, though)
moto
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
After posting the previous response I became anxious as I could not remember if I have ever used 12[0]/12[1] with CY8CKIT-059.
At the first glance, the silk print on the P12[0] and P12[1] are written 12.0 SCL and 12.1 SDA, so it was promising.
I dug out my old I2C sample project and opened, there I was using P3[0] and P3[1].
So I modified those pins to P12[0] and P12[1] and tested with LM75B (temperature sensor) as below.
And fortunately it seems to be working (^ ^)
Tera Term Log
Note: After starting the program, I touched the sensor for a while after it reached to 32 I released my finger.
schematic
Note: The sample was used to test I2C reset so the I2C component has explicit pins but usually it's not necessary.
pins
main.c
=================
#include "project.h"
#include "stdio.h"
#define LM75B_I2C_SLAVE_ADDR (0x48)
char str[128] ; /* print buffer */
void print(char *str)
{
UART_PutString(str) ;
}
void cls(void)
{
print("\033c") ; /* reset */
CyDelay(20) ;
print("\033[2J") ; /* clear screen */
CyDelay(20) ;
}
void splash(void)
{
cls() ;
sprintf(str, "PSoC 5LPI2C I2C (LM75B) Test (%s %s)\n", __DATE__, __TIME__) ;
print(str) ;
}
void init_hardware(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
UART_Start() ;
splash() ;
I2C_Start() ;
}
uint8_t myI2C_ReadByte(uint8_t reg_addr)
{
uint8_t status ;
uint8_t value = 0 ;
I2C_MasterClearStatus();
status = I2C_MasterSendStart(LM75B_I2C_SLAVE_ADDR, I2C_WRITE_XFER_MODE) ;
if (I2C_MSTR_NO_ERROR == status) {
I2C_MasterWriteByte(reg_addr);
status = I2C_MasterSendRestart(LM75B_I2C_SLAVE_ADDR, I2C_READ_XFER_MODE);
}
if (I2C_MSTR_NO_ERROR == status) {
value = I2C_MasterReadByte(I2C_ACK_DATA); // read manufacturers ID from device
}
I2C_MasterSendStop();
return(value) ;
}
int main(void)
{
uint8_t data ;
uint8_t addr = 0 ;
int i ;
init_hardware() ;
splash() ;
for(;;)
{
for (i = 0 ; i < 5 ; i++ ) {
data = myI2C_ReadByte(addr) ;
sprintf(str, "%d\n", data) ;
print(str) ;
CyDelay(1000) ;
}
}
}
=================
moto
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Dear Motoo, thank you so much for your quick response!
Larry