请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR2355 工具/软件:Code Composer Studio
MSP430FR2355 Launchpad 正在使用 AT2402 EEPROM 执行 I2C 通信测试。
我通过引用 i2c driverlib 示例编写了代码。
当您在不同的项目上运行写入操作和读取操作时、它会起作用。
EEPROM 读取序列= 1字节地址写入+读取数据1字节
写入地址1字节后、读取操作不起作用。
但是、如果您通过添加蓝色文本部分初始化 i2c、它将正常工作。
我不知道为什么。
切换读/写操作时、是否始终需要初始化 i2c?
请回复。
#include "driverlib.h" #include "Board.h" //********* // //设置从机模块的地址。 这是以 //以下格式发送的7位地址: //[A6:A5:A4:A3:A1:A0:RS] // 第一个字节的"RS"位置为零表示主 设备//发送(发送)数据到所选的从设备,而在该位置为1 表示主设备接收来自从设备的数据。 //// ***************** #define SLAVE_ADDRESS (0xA0 >> 1) //********* // //指定预期的接收数据计数。 //// ***************** #define RXCOUNT 0x01 //********* // // SMCLK 的目标频率,单位为 kHz // //********* #define CS_SMCLK_NOVE_FREQUENCY IN_kHz 1000 //********* // /SMCLK/FLLRef 比率 // //********* #define CS_SMCLK_FLLREF_Ratio 30 uint8_t RXData; EUSCI_B_I2C_initMasterParam param ={0}; void main (void) { WDT_A_HOLD (WDT_A_base); //设置 DCO FLL 基准= REFO cs_initClockSignal ( CS_FLLREF、 CS_REFOCLK_SELECT、 CS_CLOCK 分频器_1 ); //设置比率和所需的 MCLK 频率并初始化 DCO cs_initFLSettle ( CS_SMCLK_REVed_frequency in_kHz、 CS_SMCLK_FLLREF_Ratio ); //set SMCLK = DCO、分频器为1 cs_initClockSignal ( CS_SMCLK、 CS_DCOCLKDIV_SELECT、 CS_CLOCK 分频器_1 ); //set MCLK = DCO、分频器为1 cs_initClockSignal ( CS_MCLK、 CS_DCOCLKDIV_SELECT、 CS_CLOCK 分频器_1 ); //为 I2C 配置引脚 /* *选择端口5 *将引脚2、3设置为具有功能的输入、(UCB0SIMO/UCB0SDA、UCB0SOMI/UCB.S)。 * //使用内部上拉电阻将 S1设置为输入方向 GPIO_setAsInputPinWithPullUpResistor ( GPIO_PORT_UCB.S、 GPIO_PIN_UCB.S. ); GPIO_setAsInputPinWithPullUpResistor ( GPIO_PORT_UCB0SDA、 GPIO_PIN_UCB0SDA ); //为 I2C 配置引脚 GPIO_setPeripheralModuleFunctionInputPin ( GPIO_PORT_UCB.S、 GPIO_PIN_UCB.S、 GPIO_Function_UCB.S. ); GPIO_setPeripheralModuleFunctionInputPin ( GPIO_PORT_UCB0SDA、 GPIO_PIN_UCB0SDA、 GPIO_Function_UCB0SDA ); //将 P1.0设置为输出引脚。 /* *选择端口1 *将引脚0设置为输出 * /* *禁用 GPIO 上电默认高阻抗模式以激活 *先前配置的端口设置 * PMM_unlockLPM5 (); ///EUSCI_B_I2C_initMasterParam param ={0}; param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK; param.i2cClk = CS_getSMCLK (); param.datarate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS; param.byteCounterThreshold = RXCOUNT; param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP; EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、param); //指定从器件地址 EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、 从器件地址 ); //将主设备设置为接收模式 EUSCI_B_I2C_setMode (EUSCI_B0_BASE、 // EUSCI_B_I2C_Receive_mode EUSCI_B_I2C_Transmit 模式 ); //启用 I2C 模块以启动操作 EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE); EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、 EUSCI_B_I2C_Receive_INTERRUPT0 + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT + EUSCI_B_I2C_Transmit INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT ); //启用主机接收中断 EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、 EUSCI_B_I2C_Receive_INTERRUPT0 + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT + EUSCI_B_I2C_Transmit INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT ); EUSCI_B_I2C_masterSendSingleByte (EUSCI_B0_BASE、 0x08 ); while (EUSCI_B_I2C_isBusBusy (EUSCI_B0_BASE)); 而(EUSCI_B_I2C_Sending _STOP = EUSCI_B_I2C_masterIsStopSent (EUSCI_B0_BASE); /* param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK; param.i2cClk = CS_getSMCLK (); param.datarate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS; param.byteCounterThreshold = RXCOUNT; param.autoSTOPGeneration = EUSCI_B_I2C_SEND_STOP_Automatically _ON_BYTECOUNT_T_THRESHOLD; EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、param); EUSCI_B_I2C_setMode (EUSCI_B0_BASE、 EUSCI_B_I2C_Receive_mode ///EUSCI_B_I2C_Transmit 模式 ); //指定从器件地址 EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、 从器件地址 ); EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE); EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、 EUSCI_B_I2C_Receive_INTERRUPT0 + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT + EUSCI_B_I2C_Transmit INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT ); //启用主机接收中断 EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、 EUSCI_B_I2C_Receive_INTERRUPT0 + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT + EUSCI_B_I2C_Transmit INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT ); */ EUSCI_B_I2C_masterReceiveStart (EUSCI_B0_BASE); while (1) { _DELAY_CYCLES (2000); //输入 LPM0,带中断 _bis_SR_register (CPUOFF+GIE); } } #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector=USCI_B0_vector __interrupt #elif defined (__GNU__) __attribute__(interrupt (USCI_B0_vector)))#endif ISR USCIB0_void (void) 静态 uint8_t 计数= 0; 开关(__evo_in_range (UCB0IV、USCI_I2C_UCBIT9IFG)) { USCI_NONE 案例: //无中断中断中断; 中断; USCI_I2C_UCALIFG 案例: //仲裁丢失 中断; 案例 USCI_I2C_UCNACKIFG://接收到 NAK (仅限主器件) ///EUSCI_B_I2C_masterReceiveStart (EUSCI_B0_BASE); 中断; USCI_I2C_UCSTTIFG 案例: //用自己的地址检测到起始条件(只适用于从机模式) 中断; USCI_I2C_UCSTPIFG 案例: //检测到停止条件(主机和从机模式) 中断; USCI_I2C_UCRXIFG3案例: // RXIFG3 中断; USCI_I2C_UCTXIFG3案例: // TXIFG3 中断; USCI_I2C_UCRXIFG2案例: // RXIFG2 中断; USCI_I2C_UCTXIFG2案例: // TXIFG2 中断; USCI_I2C_UCRXIFG1案例: // RXIFG1 中断; USCI_I2C_UCTXIFG1案例: // TXIFG1 中断; USCI_I2C_UCRXIFG0案例: // RXIFG0 //获取 RX 数据 RXData = EUSCI_B_I2C_masterReceiveSingle ( EUSCI_B0_BASE ); 如果(++COUNT >= RXCOUNT){ 计数= 0; ///EUSCI_B_I2C_masterIsStopSent (EUSCI_B0_BASE); _nop(); _nop(); _nop(); _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0 } 中断;//向量24:RXIFG0中断; USCI_I2C_UCTXIFG0案例: // TXIFG0 中断; 案例 USCI_I2C_UCBCNTIFG://达到字节计数限制(UCBxTBCNT) GPIO_toggleOutputOnPin ( GPIO_PORT_P1、 GPIO_PIN0 ); 中断; 案例 USCI_I2C_UCCLTOIFG://时钟低电平超时-时钟保持低电平的时间过长 中断; 案例 USCI_I2C_UCBIT9IFG://在发送的第9位上生成(用于调试) 中断; 默认值: 中断; } }