各位大侠:
请问cypd3125 I2C硬件地址和HPIv2 组件内设定的slave address地址有什么关系,必须一致吗?我把CYPD3125 I2C 地址通过硬件设为0x40,感觉可以找到设备,但HPIv2 通信有问题,不知道两个地址有什么关系?哪位帮忙指点一下,谢谢
已解决! 转到解答。
Hi Sir:
读不到中断寄存器的值,无法区分是PD,device,应该是HPIv 地址问题,我修改后就ok了,后来单步定位到get_hpi_slave_addr(void)里面的I2C_CFG_Write (1) 这个地方,注释掉就可以了,不然后面一段侦测GPIO 是0 是1 的code无效
请问你说的HPIv2通信有问题具体这个问题是什么。更新固件需要从Firmware回跳到bootloader。我觉得是不是你这两者的I2C Slave address有差异但是在你上位机烧写的程序中没有体现。
我用我们的Configuration Utility是可以给通过SWDCLK设置地址为0x40的设备烧写固件的。
Hi,
我去确认了一下,bootloader的I2C slave地址确实不会根绝SWD CLK的电平作改变,只有默认的0x80。
有没有什么解决方案?或者更新bootloader?
我觉得这里你应该是在寻求更新出厂固件的方法。因为出厂固件都是默认的,可能就没有什么好的解决方式。我们的I2C bootlooader源代码是开放的,其实是做了这个设计的,可能是出厂固件中没有enable这个功能。更新bootloader需要从SWD烧写,那既然能用SWD烧写了也就失去了I2C boot的意义。
您能否告诉我您I2C bootloader用的哪个版本的?
Hi Sir:
bootloader 版本信息如下:
CYPD3125-40LQXI_i2c_boot_1_0_3_461_0_0_0_nb.hex
我们实在尝试使用HPIv2实现fw 远程更新取代SWD方法更新,另外问一下,你们的最新的I2C bootloader source code 可以在哪里下载,已经如何更新,可否给些儿建议?谢谢
I2C bootloader的工程就在Host SDK中:
Cypress\EZ-PD CCGx Host SDK\CCGx\Firmware\projects\CYPD3125-40LQXI_notebook\CYPD3125-40LQXI_notebook.cydsn\i2c_boot.cydsn
hi Sir,
在bootloader 中有看到如下code, 问题点儿应该在static void get_hpi_slave_addr(void) 内对GPIO的 三态处理,可否帮忙看一下,修改硬件I2C为何无效
static void get_hpi_slave_addr(void)
{
uint8_t addr = HPI_ADDR_I2C_CFG_FLOAT;
/* Check if IO is driven low. */
I2C_CFG_SetDriveMode(I2C_CFG_DM_RES_UP);
I2C_CFG_Write (1);//若注释掉,就可以识别0x40,但可能影响0x08 的识别
CyDelayUs (5);
if (I2C_CFG_Read () == 0)
{
addr = HPI_ADDR_I2C_CFG_LOW;
}
else
{
/* Check if IO is driven high. */
I2C_CFG_SetDriveMode(I2C_CFG_DM_RES_DWN);
I2C_CFG_Write(0);
CyDelayUs(5);
if (I2C_CFG_Read() != 0)
{
addr = HPI_ADDR_I2C_CFG_HIGH;
}
}
/* Disable the pull up/pull down on IO. */
I2C_CFG_SetDriveMode(I2C_CFG_DM_ALG_HIZ);
hpi_set_fixed_slave_address(addr);
}
这部分代码是有效的,包括你用的CYPD3125-40LQXI_i2c_boot_1_0_3_461_0_0_0_nb.hex,我这里都是可以找到0x40的slave并且下载固件的。我们更老的版本bootloader没有这个功能。如果你用这个版本的bootloader也无法下载固件,可能问题还是出在你的上位机程序上。
我看您的代码里也有打印信息,能否定位下向0x40下载固件时是到哪一步出错的?
Hi Sir:
读不到中断寄存器的值,无法区分是PD,device,应该是HPIv 地址问题,我修改后就ok了,后来单步定位到get_hpi_slave_addr(void)里面的I2C_CFG_Write (1) 这个地方,注释掉就可以了,不然后面一段侦测GPIO 是0 是1 的code无效