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.

[参考译文] TM4C123GH6PM:外部 EEPROM (24LC64)使用 i2c 进行通信、我可以#39;t 将当前值写入 EEPROM。

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1128868/tm4c123gh6pm-external-eeprom-24lc64-uses-i2c-to-communicate-i-can-t-write-the-current-value-into-the-eeprom

器件型号:TM4C123GH6PM

代码

#include
#include
#include
#include
#include
#include
#include "inc/hw_ints.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_gpio.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/QEI.h"
#include "driverlib/sysctl.h"
#include "driverlib/pwm.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "math.h"
#include "driverlib/i2c.h"
#include "driverlib/adc.h"
#include "driverlib/timer.h"

void Init_Clk (void);
void Init_Timer( void );
void Timer0_ISR( void );
void Init_I2C( void );

#define SLAVE_ADDRESS 0x50
#define WRITE_ADDRESS 0x01
#define DATA 0xAB
int a=0;
volatile long Cnt32_1 = 0;
int b=0;
void Init_I2C( void )

A=1;
SysCtlPeripheralEnable (SYSCTL_Periph_I2C1);
SysCtlPeripheralEnable( sysctl_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA6_I2C1SCL);
GPIOPinConfigure (GPIO_PA7_I2C1SDA);
GPIOPinTypeI2CSCL (GPIO_Porta_base、GPIO_PIN_6);
GPIOPinTypeI2C (GPIO_Porta_base、GPIO_PIN_7);
I2CMasterInitExpClk (I2C1_base、SysCtlClockGet ()/100、false);
I2CMasterEnable (I2C1_base);
///-------- ---------- //
A=2;
I2CMasterSlaveAddrSet( I2C1_base、slave_address、false );
I2CMasterDataPut (I2C1_base、0x00);
while (I2CMasterBusy (I2C1_base)){}
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);
while (I2CMasterBusy (I2C1_base)){}
A=3;
I2CMasterDataPut (I2C1_base、write_address);
A=10;
while (I2CMasterBusy (I2C1_base)){}
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_CONT);
while (I2CMasterBusy (I2C1_base)){}
A=4;
I2CMasterDataPut( I2C1_base,data );
while (I2CMasterBusy (I2C1_base)){}
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_FINISH);
while (I2CMasterBusy (I2C1_base)){}
A=5;
///-------- ---------- //
I2CMasterSlaveAddrSet( I2C1_base、slave_address、false );

I2CMasterDataPut( I2C1_base,0x00 );
while (I2CMasterBusy (I2C1_base)){}
I2CMasterControl( I2C1_base、I2C_MASTER_CMD_BURST_SEND_START );
while (I2CMasterBusy (I2C1_base)){}
A=6;
I2CMasterDataPut (I2C1_base、write_address);
while (I2CMasterBusy (I2C1_base)){}
I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_CONT);
while (I2CMasterBusy (I2C1_base)){}
A=7;
I2CMasterSlaveAddrSet( I2C1_base、slave_address、true );
while (I2CMasterBusy (I2C1_base)){}
while (I2CMasterBusy (I2C1_base)){}
A=8;
I2CMasterControl( I2C1_base、I2C_MASTER_CMD_SINGLE_Receive );
while (I2CMasterBusy (I2C1_base)){}
//获取值
Cnt32_1 = I2CMasterDataGet (I2C1_base);

void main (void)

SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN);
init_i2c();
while (1)


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

    您好!

     我不熟悉 Microchip 24LC64。 但是、查看您的代码、我可能会发现有一件事情是错误的。 在"读取"部分中、您编写了如下内容、其中指定了 false。 false 意味着它是一个写入。 我想您读一下。 您应该改为通过 true。  

    ///-------- ---------- //
    I2CMasterSlaveAddrSet( I2C1_base、slave_address、false );

     我注意到的另一件事是、对于读取、首先是 I2C_MASTER_CMD_BURST_SEND_START、然后是 I2C_MASTER_CMD_BURST_SEND_CONT.  这些用于发送、而不是接收。 如果   要使用猝发模式进行读取、应使用:I2C_MASTER_CMD_BURST_Receive_start、I2C_MASTER_CMD_RUST_RUSE_CONT 和:I2C_MASTER_CMD_BURST_RUST_RUSE_FINISH。  

     请参阅此应用手册、了解如何使用 I2C 模块。  https://www.ti.com/lit/pdf/spma073

     此外、请确保 SCL 和 SDA 总线上具有正确的从器件地址值和正确的上拉电阻器。 调试 I2C 的最佳方法是使用示波器或逻辑分析仪。  

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

    我已经尝试过您的方法、但没有成功。
    我的想法是找出 EEPROM 的位置、然后读取数据
    但我读取的值是0xFF

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

    最好的方法是查看示波器捕获、或者更好地使用逻辑分析仪。 它应该清楚地显示正在写入总线上的 EEPROM 的内容、以及与24LC64要求的内容相比、它的读取情况。