您好!
我想在硬件定义的引脚之外的引脚上使用 I2C 访问 EEPROM (24AA128)。 因此、我尝试在软件中实现 I2C 协议。 但我遇到了一些奇怪的问题、请查看下面的实施情况、看看是否有人可以找出问题。
我的软件 I2C 功能:
void i2c_software_gpio_init (void) { EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO30 = 1; GpioCtrlRegs.GPAPUD.bit.GPIO31 = 1; GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 0; GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0; GpioCtrlRegs.GPADIR.bit.GPIO30 = 1; GpioCtrlRegs.GPADIR.bit.GPIO31 = 1; EDIS; } void i2c_software_start_condition (void) { SDA_SET; SCL_SET; 延迟(40); SDA_CLEAR; 延迟(40); SCL_CLEAR; 延迟(40); } void i2c_software_stop_condition (void) { SDA_CLEAR; SCL_SET; 延迟(40); SDA_SET; 延迟(40); SCL_CLEAR; 延迟(40); } uint8 i2c_software_write_byte (uint16字节) { uint16 i; uint8 ACK = 0; 对于(i=0;i<8;i++){ if (byte & 0x80){ SDA_set; } 否则{ SDA_CLEAR; } SCL_SET; 延迟(20); SCL_CLEAR; 延迟(20); 字节<<= 1; } SDA_SET; SCL_SET; SDA_DIR = IN_MODE; ACK = SDA; 延迟(20); SCL_CLEAR; SDA_DIR = OUT_MODE; SDA_CLEAR; 延迟(20); 返回!ACK ;} uint16 i2c_software_read_Byte (uint16 ack_bit) { uint16 i、byte = 0; SDA_DIR = IN_MODE; 对于(i=0;i<8;i++){ SCL_SET; 字节<<= 1; 延迟(20); 字节=(字节| SDA); SCL_CLEAR; 延迟(20); } SDA_DIR = OUT_MODE; 如果(ACK_BIT = 1) SDA_CLEAR; 其他 SDA_SET; 延迟(12); SCL_SET; 延迟(20); SCL_CLEAR; 延迟(20); 返回字节; }
#define SCL_set GpioDataRegs.GPASET.ALY|=0x40000000 #define SCL_Clear GpioDataRegs.GPACLEAR.ALY|=0x40000000 #define SDA_set GpioDataRegs.GPASET.ALY|=0x80000000 #define SDA_Clear GpioRegs.GPADA.1#define GPADA.GPIO1.GPIO1.000#define GPIOREP.GPIO1.GPIO1.GPIO1.000#define G1_GPIOREP.GPIO1.GPIO1.GPIO1.GPIO1.GPIOR.GPIO1.GPIO1.GPIOR.GPIO1.GPIOR.GPIO1.GPIO1.GPIOR.GPIO1.GPIO1.GPIOR.GPIO
调用这些函数以访问 eerprom 的序列(24AA128):
I2C_software_start_condition (); AC1 = i2c_software_write_byte (EEPROM_address | 0); AC2 = i2c_software_write_byte (0x00); AC3 = i2c_software_write_byte (0x00); AC4 = i2c_software_write_byte (0xc0); I2C_software_stop_condition (); Task_sleep (10); I2C_software_start_condition (); AC1 = i2c_software_write_byte (EEPROM_address | 0); AC2 = i2c_software_write_byte (0x00); AC3 = i2c_software_write_byte (0x00); Task_sleep (10); I2C_software_start_condition (); AC4 = i2c_software_write_byte (EEPROM_address | 1); EEPROM_DATA_Receive = i2c_software_read_Byte (0); I2C_software_stop_condition (); Task_sleep (20);
逻辑分析仪上生成的信号
逻辑分析仪可以正确解码信号、但第三个字节中的一个零的长度比其他字节长、这可能是问题、但不知道导致问题的原因。 当我将信号连接到 EEPROM 时、我确实会从该信号获得任何响应。
如果我有任何问题、请告诉我。
谢谢、
Najeeb

