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.
尊敬的先生:
我正在尝试 制作一个简单的 I2C 主设备代码来将值写入 EEPROM AT24C02D-SSHM-T 我在这里使用的是 MSP430FR5994IPNR。
我有一个简单的 I2C 代码、但它不起作用。 我 在这里使用的从器件地址是0xA0。我将 EEPROM 的 A0、A1和 A2线路短接至接地。 请为此 EEPROM 提供工作代码。
此致、
Neethu
示例代码:
//
#include
const unsigned char TXData[]={0xAA};
const unsigned char SlaveAddress[]={0xA0};
volatile unsigned char TXByteCtr;
volatile unsigned char SlaveFlag = 0;
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;
//配置 GPIO
P7SEL0 |= BIT0 | BIT1;
P7SEL1 &=~(BIT0 | BIT1);
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//将 USCI_B2配置为 I2C 模式
UCB2CTLW0 = UCSWRST;//将 eUSCI_B 置于复位状态
UCB2CTLW0 |= UCMODE_3 | UCMST | UCSSEL_SMCLK;// I2C 主控模式、SMCLK
UCB2BRW = 0x8;//波特率= SMCLK / 8
UCB2CTLW0 &=~UCSWRST;//清除复位寄存器
UCB2IE |= UCTXIE0 | UCNACKIE;//发送和 NACK 中断使能
SlaveFlag = 0;//初始化 SlaveFlag
while (1)
{
__DELAY_CYCLES (1000);//传输之间的延迟
// UCB2I2CSA = SlaveAddress[SlaveFlag];//配置从地址
UCB2I2CSA = 0xA0;//配置从器件地址
TXByteCtr = 1;//加载 TX 字节计数器
while (UCB2CTLW0和 UCTXSTP);//确保发送了 STOP 条件
UCB2CTLW0 |= UCTR | UCTXSTT;// I2C TX,启动条件
_bis_SR_register (LPM0_bits | GIE);//输入 LPM0、带中断
//保持在 LPM0中直到所有数据
//是 TX
//更改从机地址
}
}
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B2_vector
_interrupt void USCI_B2_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(EUSCI_B2_vector)) USCI_B2_ISR (void)
其他
错误编译器不受支持!
#endif
{
开关(__evo_in_range (UCB2IV、USCI_I2C_UCBIT9IFG))
{
实例 USCI_NONE:break;//向量0:无中断
案例 USCI_I2C_UCALIFG:中断;//矢量2:ALIFG
案例 USCI_I2C_UCNACKIFG://向量4:NACKIFG
UCB2CTLW0 |= UCTXSTT;//如果 NACK,则重新发送开始
中断;
案例 USCI_I2C_UCSTTIFG:中断;//矢量6:STTIFG
案例 USCI_I2C_UCSTPIFG:中断;//矢量8:STPIFG
案例 USCI_I2C_UCRXIFG3:中断;//向量10:RXIFG3
案例 USCI_I2C_UCTXIFG3:中断;//向量12:TXIFG3
案例 USCI_I2C_UCRXIFG2:中断;//向量14:RXIFG2
案例 USCI_I2C_UCTXIFG2:中止;//向量16:TXIFG2
案例 USCI_I2C_UCRXIFG1:中断;//向量18:RXIFG1
案例 USCI_I2C_UCTXIFG1:中断;//向量20:TXIFG1
案例 USCI_I2C_UCRXIFG0:中断;//矢量22:RXIFG0
案例 USCI_I2C_UCTXIFG0://向量24:TXIFG0
if (TXByteCtr)//检查 TX 字节计数器
{
// UCB2TXBUF = TXData[SlaveFlag];//加载 TX 缓冲区
UCB2TXBUF = 0xAA;//加载 TX 缓冲器
TXByteCtr -;//减量 TX 字节计数器
}
其他
{
UCB2CTLW0 |= UCTXSTP;// I2C 停止条件
UCB2IFG &=~UCTXIFG;//清除 USCI_B2 TX 内部标志
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
}
中断;
案例 USCI_I2C_UCBCNTIFG:break;//向量26:BCNTIFG
案例 USCI_I2C_UCCLTOIFG:中断;//矢量28:时钟低电平超时
案例 USCI_I2C_UCBIT9IFG:中断;//矢量30:第9位
默认值:break;
}
}
您好 Neethu、
我认为此主题可能与您尝试执行的操作相关:
希望这对您有所帮助。
BR、
Leo
AT24C02D 的从器件地址为0x50、而不是0xA0。 R/W 位不是地址的一部分。