This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2538:CC2538 I2C EEPROM 24lc16b

Guru**** 2529560 points
Other Parts Discussed in Thread: CC2538

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/665194/cc2538-cc2538-i2c-eeprom-24lc16b

部件号:CC2538

大家好! 我使用CC2538作为i2c主控,从EEPROM 24lc16b读取字节时遇到问题。 此EEPROM始终响应0xFF,我不知道原因。 SDA和SCL引脚上有两个上拉电阻器2.5k。 我附上了三个示波器图表:第一个是写字节0x1,第二个是读之前发送EEPROM地址(相同),第三个是读时。 我的代码在此处:

//
// I2C外设必须在使用前启用。
//
SysCtrlPeripheralEnable(SYS_CTRL_Periph_I2C);

//
//配置I2C引脚
//
GPIODIRModeSet (GPIO _I2C_BASE,PIN_I2C_SCL,GPIO _ DIR_MODE_HW);
GPIOPinTypeI2C (GPIO _I2C_BASE,PIN_I2C_SCL);
GPIODIRModeSet (GPIO _ I2C_BASE,PIN_I2C_SDA,GPIO _ DIR_MODE_HW);
GPIOPinTypeI2C (GPIO _I2C_BASE,PIN_I2C_SDA);
//
//将引脚配置为外设输入和输出
//
IOCPinConfigPeriphInput (GPIO _I2C_BASE,PIN_I2C_SCL,
IOC_I2CMSSCL);
IOCPinConfigPeriphInput (GPIO _I2C_BASE,PIN_I2C_SDA,
IOC_I2CMSSDA);
IOCPinConfigPeriphOutput (GPIO _I2C_BASE,PIN_I2C_SCL,
IOC_MUX_OUT _SEL_I2C_CMSSCL);
IOCPinConfigPeriphOutput (GPIO_I2C_BASE,PIN_I2C_SDA,
IOC_MUX_OUT SEL_I2C_CMSSDA);

//
//启用并初始化I2C主模块。 使用的系统时钟
// I2C模块。 最后一个参数设置I2C数据传输速率。
//如果为false,则数据速率设置为100kbps;如果为true,则数据速率将为
//设置为400kbps。 在此示例中,我们将使用100kbps的数据速率。
//
I2CMasterInitExpClk(SysCtrlClockGatet(),false);

#define	I2C_ADDR_24LC16 		(0xA0UL) 	

I2C_addr =(DWORD)((I2C_ADDR_24LC16 & 0xF0)>1>1);

//正在写入
// EEPROM地址+内存块地址。 最后参数表示书写
I2CMasterSlaveAddrSet(i2c_addr|0x1, false);
//将一个字节0x1放置到DR寄存器中
I2CMasterDataPut(0x1);
//发送EEPROM地址,内存块地址和一个字节
I2CMasterControl(I2C_MASTER_CMD_SINGLE_SEND);
//等待直至完成
while (I2CMasterBusy());

//读数
// EEPROM地址+内存块地址。 最后参数表示书写
I2CMasterSlaveAddrSet(i2c_addr|0x1, false);
//发送EEPROM地址和内存块地址
I2CMasterControl(I2C_MASTER_CMD_SINGLE_SEND);
// EEPROM地址+内存块地址。 最后参数表示读数
I2CMasterSlaveAddrSet(i2c_addr|0x1, true);
//发送EEPROM地址和内存块地址
I2CMasterControl(I2C_MASTER_CMD_SINGLE_SEND);
//从DR寄存器读取字节
UINT32_t ans = I2CMasterDataSet();
//等待直至完成
while (I2CMasterBusy()); 

书写:

发送地址:


读数:

请帮助他人解决这个问题。


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    添加:
    当我写入字节0x2而不是0x1时-读数正确(0x2)。 当我写入0x2,0x202,0x302,...,0x802字节时,我只读取最小部分- 0x2。 写入所有其他字节后,我将读取0xFF。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    经过几天的了解,我终于找到了解决方案。 代码如下:

    #define	I2C_ADDR_24LC16 		(0xA0UL)	
    
    //写入一个16字节的块:
    
    unsigned char addr_hi;
    unsigned char txbuf[17];
    dword i2c_addr;
    
    //确定地址
    addr_hi =(unsigned char)((addr >> 8)& 0x07); //addr是EEPROM中块的地址
    //发送到消息
    txbuf[0]=(unsigned char)(addr & 0xFF)的地址的最下面部分;
    //为
    (dword i=0;i<count;i++)
    {
    txbuf[i+1]= i;
    };
    i2c_addr =(DWORD)((I2C_ADDR_24LC16 & 0xF0)|(addr_hi <<1)>>1);
    
    I2CMasterSlaveAddrSet(i2c_addr, false);
    I2CMasterDataPut(txbuf[0]);I2CMaster_Control_start_I2CMD_STESTESTELD)
    
    //Wait until done
    while (I2CMasterBusy());
    while (I2CMasterErr());
    if (count>0) //count是字节数(=16)
    {
    用于(int i=1;i<计数;i++)
    {
    I2CMasterDataPut(txbuf[i]);
    I2CMasterControl (I2C_MASTER_CMD_STUSTREG_SEND_CONT);
    //等待直至完成
    while (I2CMasterBusy());
    while (I2CMasterErr()); //检查I2CM_STAT
    }中的错误位
    I2CMasterDataPut(txbuf[count]);
    I2CMasterControl (I2C_MASTER_CMD_STUSTREG_SEND_FINISH);
    //等待直至完成
    while (I2CMasterBusy());
    while (I2CMasterErr()); //检查I2CM_STAT中的错误位
    }
    
    
    //读取16字节块:
    
    unsigned char addr_hi;
    
    
    unsigned i2c_addr;addr_hi =(Slavchar)(((addr >> 8)和0x07);
    i2c_addr =(DWORD)(I2C_ADDR_24LC16 & 0xdr)|(addr_lavchar =(addr_8)接收
    
    
    iCM1;I2c_imburst/接收<) I2cm1
    
    while (I2CMasterErr()); //检查I2CM_STAT中的错误位
    (int i=0;i<count;i++)
    {
    ((uint8_t*)data)[i]= I2CMasterDataSet();//从DR寄存器读取字节
    I2CMasterControl (I2C_MASTER_CMD_STUSTREG_Receive_CONT);
    //等待直至完成
    while (I2CMasterBusy());
    while (I2CMasterErr()); //检查I2CM_STAT
    }中的错误位
    I2CMasterControl(I2C_MASTER_CMD_STUSTRE_receive_fine);
    //Wait until done
    while (I2CMasterBusy());
    I2CMasterErr());
    
    
    
    我希望它能帮助某人。