您好,
我正在尝试从从属设备(24lc04 FRAM)接收我已传输的相同数据(传输成功,通过SDA获得数据突发)。
下面是我的代码,Pls建议我是否正确地从从属设备接收数据?? 以及如何验证?
/* I2C从属设备的从属设备地址*/
#define slaver_address 0x50
#define NUM_OF_RX_Bytes 10.
/*静态*/
静态uint8_t TXData[10]={0x06,0x3A,0x1E,0x39,0x1C, 0x79,0x5D,0x6C,0x0C,0x01};
静态uint8_t TXByteCtr = 1;
静态uint8_t已发送= 0;
静态uint8_t RXData[NUM_OF_RX_bytes];
静态易失性UINT32_t xferIndex;
静态挥发性双刀头止动Sent;
/* I2C主配置参数*/
const eUSI_I2C_MasterConfig i2cConfig =
{
EUSCI_B_I2C_CLOCKSOURCE_SMCLK, // SMCLK时钟源
300万, // SMCLK = 3MHz
EUSCI_B_I2C_SET_DATA_RATE_100KBPS ,//所需的I2C时钟为100kHz
0, //无字节计数器阈值
EUSCI_B_I2C_NO_AUTO_STOP //无自动停止
};
内部主(无效)
{
易失性UINT32_t ii;
/*禁用监视 程序*/
WDT_A_HoldTimer();
P2->DIR = BIT7;
port_init();// 初始化端口
INIT_LCD();
已发送= 0;
/*为I2C选择端口1 -将引脚6,7设置为输入主模块功能,
* (UCB0SIMO/UCB0SDA,UCB0SOMI/UCB.S.)。
*/
GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P1,
GPIO _PIN6 + GPIO _PIN7,GPIO主要模块功能);
stopSent =假;
// memset (RXData,0x00,NUM_OF_REC_Bytes);
/*在100kHz的频率下将I2C主设备初始化到SMCLK,没有自动停止*/
I2C_initMaster (EUSI_B0_BASE,&i2cConfig);
/*指定从属地址*/
I2C_setSlaveAddress (EUSCI_B0_BASE,SLAVE_ADDRESS);
/*将主中继器设置为传输模式*/
I2C_setMode (EUSI_B0_BBASE,EUSI_B_I2C_Transmit_mode);
/*启用I2C模块以启动操作*/
I2C_enableModule (EUSI_B0_BASE);
/*启用并清除中断标志*/
I2C_clearInterruptFlag (EUSI_B0_BASE,
EUSCI_B_I2C_Transmit_INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);
//启用主接收中断
I2C_enableInterrupt (EUSCI_B0_BBASE,EUSCI_B_I2C_Transmit_INTERRUPT0 + EUSCI_B_I2C_NAK_interrupt);
interrup_enableSleepOnIsrExit();
interrup_enableInterrupt (INT_EUSCIB0);
I2C_masterSendStart (EUSI_B0_BASE);
同时(1)
{
while (I2C_masterIsStopSent (EUSCI_B0_BBASE)== EUSCI_B_I2C_Sending停止);
//发送初始启动条件
I2C_masterSendMultiByteStart (EUSI_B0_BASE,TXData[0]);
interrup_enableSleepOnIsrExit();
PCM_gotoLPM0InterruptSafe ();
/* intToStr (数据,分辨率,1);
Display2 (res);*/
}
}
/*******************************************************************************
* eUSCIB0 ISR。 重复的启动和传输/接收操作发生
*在本ISR内。
***************** /
void EUSCIB0_IRQHandler (void)
{
UINT_FAST16_t状态;
状态= I2C_getEnabledInterruptStatus (EUSI_B0_BASE);
I2C_clearInterruptFlag (EUSI_B0_BASE,STATUS);
IF (状态和EUSCI_B_I2C_NAK_INTERRUPT)
{
I2C_masterSendMultiByteStart (EUSI_B0_BASE,TXData[0]);
}
IF (状态和EUSCI_B_I2C_Transmit_INTERRUPT0)
{
//检查字节计数器
如果(!sent)
{
//发送下一个数据并递减字节计数器
I2C_masterSendMultiByteNext(EUSI_B0_BASE,TXData[TXByteCtr ]);
已发送= 1;
}
否则
{
I2C_masterSendMultiByteStop (EUSI_B0_BASE);
interrupT_disableSleepOnIsrExit();
TXByteCtr ++;
IF (TXByteCtr > 10)
TXByteCtr ++;
// 在接收模式下设置
I2C_setMode (EUSCI_B0_BBASE,EUSCI_B_I2C_receive模式);
I2C_clearInterruptFlag (EUSI_B0_BBASE,EUSI_B_I2C_Receive_INTERRUPT0);
I2C_enableInterrupt (EUSI_B0_BBASE,EUSI_B_I2C_receive _INTERRUPT0);
// I2C_masterReceiveStart (EUSCI_B0_BASE);
// I2C_DisableInterrupt (EUSCI_B0_BBASE,EUSCI_B_I2C_Transmit_INTERRUPT0);
已发送= 0;
}
}
IF (状态和EUSCI_B_I2C_Receive_INTERRUPT0)
{
p2->out ^= BIT7;
RXData[xferIndex+]= I2C_masterReceiveMultiByteNext (EUSCI_B0_BASE);
数据= RXData[xferIndex];
//如果在末尾,则重置索引
IF (xferIndex == NUM_OF_RX_bytes)
xferIndex = 0;
I2C_setMode (EUSI_B0_BBASE,EUSI_B_I2C_Transmit_mode);
//启用I2C模块以启动操作
I2C_enableModule (EUSI_B0_BASE);
//启用并清除中断标志
I2C_clearInterruptFlag (EUSI_B0_BASE,
EUSCI_B_I2C_Transmit_INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);
//启用主接收中断
I2C_enableInterrupt (EUSCI_B0_BBASE,EUSCI_B_I2C_Transmit_INTERRUPT0 + EUSCI_B_I2C_NAK_interrupt);
// I2C_masterSendStart (EUSCI_B0_BASE);
// I2C_DisableInterrupt (EUSCI_B0_BBASE,EUSCI_B_I2C_Receive_INTERRUPT0);
}
}