请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TM4C123GH6PZ 您好!
我需要在 TM4C123GH6PZ 控制器中配置 I2C 从模式。
最初、当我将数据从从属电路板传输到主电路板时、它工作正常、没有任何问题。 假设我仅重置主板电源、它会造成问题。 在主器件侧复位电源后、在主器件侧接收的数据会互换。 I mean (LSB 和 MSB 数据互换)。
我使用从板中的调试器进行了检查、它仅显示正确的数据格式。 当我在主板中连接调试器时、它会显示互换 的数据。
您能帮您解决这个问题吗?
我给出了代码。 我可能没有包含一些变量声明。 由此给您带来的不便、我们深表歉意
#include "FSI_SMB.h" #include "common_header.h" #include "GPIO.h" #define MAX_TX_Bytes2 //待发送的最大字节数 #define MAX_I2C_Tx_SIZE2 //待发送的最大字节数 unsigned char Data_Tx_Buffer[6][MAX_TX_Bytes]={'0'}_RX_Bytes' };'max_bytes ={0'} //SMB 相关常量 #define SMB_buffer32//最大 SMB 消息大小 #define SMB_TIMEOUT_LENGTH30// ms -事务超时(任何 SMB 事务不能比此更长) // SMB 字 #define SMB_WORD2 //字节 #define SMB_BYTE 的大小 1 // SMB 通道标志 #define SMB_FLAG_PEC(1 <<0) define SLAVE_ADDRESS0x0B //从板配置 #define Bay1_CELA_I2C1 #define Bay1_CellB_I2C2 #define Bay2_CELA_I2C3 #define Bay2_CellB_BI2C4 // I2C0从配置 #define I2C0_SYSCTK_GPIOx #define GPIO2C_IPB_I2CL_I2CL_GPIO0_GPIO0_GPIO2C_C0_GPIO2C_CL_GPIO2C_CAST_GPIO2_GPIO_GPIO_I2C_CL_GPIO0_GPIO2_C0_GPIO_GPIOR_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO2_GPIO0_GPIO0_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO2_ Pin_map.h Pin_map.h GPIO_PIN_3 #define BASE_I2C0I2C0_BASE #define INT0_I2CINT_I2C0 // I2C3从配置 #define I2C3_SYSCTL_PERIPH_GPIOx SYSCTL_PERIP_GPIOxSYSCC3_GPIO0 #define I2C3_GPIO_GPIO1_GPIO1_GPIO_GPIO_GPIO2C3_CA_GPIO1_GPIO_GPIO2_GPIO1_GPIO_GPIO_GPIO_GPIO_GPIO2_GPIO1_GPIO_GPIO1_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO2_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO2_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO Pin_map.h Pin_map.h define I2C4_SYSCTL_PERIPH_GPIOxSYSCTL_PERIPH_GPIOG #define I2C4_SYSCTL_I2CxSYSCTL_PERIPH_I2C4 #define I2C4_GPIO_P2C_SYSCT2_I2C_GPIO_GPIO_GPIO2C_CA_GPIO2C_CA_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_C4_3Pin_map.h GPIO2_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_CI_C4_ Pin_map.h - Pin_map.h #define I2C5_GPIO_PGx_I2CxSDAGPIO_PG7_I2C5SDA//GPIO_PG7_I2C5SDA - Pin_map.h #define I2C5_GPIO_Portx_BASEGPIO_PORTG_BASE #define I2C5_SCLGPIO_PIN_6 #define I2C5_GPIO_PIN_PIN_PHIN 2数据包 ;#define I2C5_USC5_OUT5_BIST_2数据包0;#define I2CU_INT_INTS5_INTS5数据包2 Bay1_Calib、Bay2_Full、Bay2_Calib; / * I2C 硬件初始化 *索引- I2C 通道索引(I2C0 | OUTI2C) * ownAddress -自 SMB 地址 / void initI2C (uint8索引、uint8 ownAddress) { if (index = Bay1_Cella _I2C)// I2C 零通道// Bay1 Cella { //从 I2C0初始化 SysCtlPeripheralEnable (I2C0_SYSCTL_Periph_I2Cx);//启用外设。 SysCtlPeripheralEnable (I2C0_SYSCTL_Periph_GPIOx);//启用外设。 GPIOPinConfigure (I2C0_GPIO_PBX_I2CxSCL); GPIOPinConfigure (I2C0_GPIO_PBX_I2CxSDA); GPIOPinTypeI2CSCL (I2C0_GPIO_Portx_BASE、I2C0_SCL);// SCL GPIOPinTypeI2C (I2C0_GPIO_Portx_BASE、I2C0_DTA); I2CSlaveInit (base_I2C0、ownAddress);//初始化 I2C 从设备块 I2CSlaveEnable (BASE_I2C0);//启用 I2C 从设备块 I2CSlaveIntEnable (BASE_I2C0);//启用 I2C 从机中断 IntEnable (INT0_I2C); } 否则、如果(INDEX = Bay1_CellB_I2C)// I2C 第三通道// Bay1 CellB { //从 I2C3初始化 SysCtlPeripheralEnable (I2C3_SYSCTL_Periph_I2Cx);//启用外设。 SysCtlPeripheralEnable (I2C3_SYSCTL_Periph_GPIOx);//启用外设。 GPIOPinConfigure (I2C3_GPIO_PGx_I2CxSCL); GPIOPinConfigure (I2C3_GPIO_PGx_I2CxSDA); GPIOPinTypeI2CSCL (I2C3_GPIO_Portx_BASE、I2C3_SCL);// SCL GPIOPinTypeI2C (I2C3_GPIO_Portx_BASE、I2C3_DTA); I2CSlaveInit (base_I2C3、ownAddress);//初始化 I2C 从设备块 I2CSlaveEnable (BASE_I2C3);//启用 I2C 从设备块 I2CSlaveIntEnable (BASE_I2C3);//启用 I2C 从机中断 IntEnable (INT3_I2C); } 否则、IF (INDEX = Bay2_Cella _I2C)// I2C 第四通道// Bay2 Cella { //从 I2C4初始化 SysCtlPeripheralEnable (I2C4_SYSCTL_Periph_I2Cx);//启用外设。 SysCtlPeripheralEnable (I2C4_SYSCTL_Periph_GPIOx);//启用外设。 GPIOPinConfigure (I2C4_GPIO_PGx_I2CxSCL); GPIOPinConfigure (I2C4_GPIO_PGx_I2CxSDA); GPIOPinTypeI2CSCL (I2C4_GPIO_Portx_BASE、I2C4_SCL);// SCL GPIOPinTypeI2C (I2C4_GPIO_Portx_BASE、I2C4_DTA); I2CSlaveInit (base_I2C4、ownAddress);//初始化 I2C 从设备块 I2CSlaveEnable (BASE_I2C4);//启用 I2C 从设备块 I2CSlaveIntEnable (BASE_I2C4);//启用 I2C 从机中断 IntEnable (int4_I2C); } 否则、如果(INDEX = Bay2_CellB_I2C)// I2C 第五通道// Bay2 CellB { //从 I2C5初始化 SysCtlPeripheralEnable (I2C5_sysctl_Periph_I2Cx);//启用外设。 SysCtlPeripheralEnable (I2C5_sysctl_Periph_GPIOx);//启用外设。 GPIOPinConfigure (I2C5_GPIO_PGx_I2CxSCL); GPIOPinConfigure (I2C5_GPIO_PGx_I2CxSDA); GPIOPinTypeI2CSCL (I2C5_GPIO_Portx_BASE、I2C5_SCL);// SCL GPIOPinTypeI2C (I2C5_GPIO_Portx_BASE、I2C5_DTA); I2CSlaveInit (base_I2C5、ownAddress);//初始化 I2C 从设备块 I2CSlaveEnable (BASE_I2C5);//启用 I2C 从设备块 I2CSlaveIntEnable (BASE_I2C5);//启用 I2C 从机中断 IntEnable (INT5_I2C); } #endif } /********* *返回相应的 SMBus 基值 / uint32 I2CBaseS (uint8索引) { uint32 Slave_base = 0; switch (index) { Case Bay1_Cella I2C: Slave_base = base_I2C0; break; Case Bay1_CellB_I2C: slave_base = base_I2C3; break; case Bay2_Cella: slave_base_bend;bay2c4 = base_base_base_base_base_base_I2C;case = base_base_base_sta. *将相应的 SMBus 命令数据返回到缓冲区 / void SMB_SLAVE_TX_DATA (uint8索引、uint8命令) { switch (command) { case SMB_specification _info: temp_data[index]= 0x0003; break; case SMB_CYCLE:temp_DATA[index] = 0x0005; break; case SMB_MAX_ERROR: if (Bay1_CALIBRATE=0x0A=0x0A_CLA = 0x0A ; = 0xbay2C_BIC_BIC_DATA_CLABLE_CLABLETE_ENABLE[0x0A]= 0x0A[0A]= 0xbay_CLABLE_CLAB_ENABLE_CLAB_ENAB_ENAB_ENAB_ENABLE];{= 0x0A[0x0A]= 0x0002_CY_CLIP_CLIP_CLIP_CLIP_CLAB_CLAB_ENAB_ENAB_CL temp_data[Bay2_CellB_I2C]= 0x0A; } 否则 { temp_data[Bay2_Cella _I2C]= 0x02; temp_data[Bay2_CellB_I2C]= 0x02; } break; case SMB_BAT_A2= 0x00BA_E2_E2[= 0x00BA_E2_E2_ENABLE_END] ;temp_Bay2_E2_E2_E2C_ENABLE_PAY_E= 0x00_E2_E2_PAY_PAY_E12_E= 0x0002;= 0xBA_E2_ENABLE_PAY_END[PAY_E_E_PAY_PAY_PAY2_E_E_PAY_E2_PAY_PAY_PAY_PAY_100]= 0x0002 = 0x0002 = 0x0002;= 0x00_EART_E2_ temp_data[Bay2_CellB_I2C]= 0x00A0; } 否则 { temp_data[Bay2_Cella _I2C]= 0x0080; temp_data[Bay2_CellB_I2]= 0x0080; } break; case SMB_CHARING_VOLTAGE: temp_DATA[index]= 0x41A0;// 16800 break;// temp_data/intry[0x3000mV/ inch[000mV[000_b] ;case = 0x3000mb = 0x3000mb;/b_data_index = 0x000mV/ incharge[000m];/b./000mVb = 0x3000mb = 0x3000mb;/b./000mb = 0x3000mb;// case smb_at_rate time_TO_full: temp_data[索引]= 0x0050; break; case smb_at_rate time_TO_empty: temp_data[索引]= 0x0070; break; case smb_relat_State_of _charge: temp_data[索引]= 0x0041; case SMB_absolute_State_index] ;temp_data_data_index]= 0x0031;temp_data_data_data_index]= 0x0031;case:0x0031;temp_data_data_index_data_index_deg[0x0031;t_data_index];t_data_data_index]= 0x0031 = 0x0031;tb = 0x000_data_data_deg_ MSB_DATA = MSB_DATA >> 8; Data_Tx_Buffer[index][0]= MSB_DATA; Data_Tx_Buffer[index][1]= LSB_DATA; } /******** *中断处理程序(索引- SMB 通道索引 / void I2CHandler (uint8索引) { // uint32 Basem = I2CBaseM (索引);//获取主寄存器基础 uint32 bases = I2CBaseS (INDEX);//获取从机寄存器基址 uint8状态; uint8数据; //从机模式 if (I2CSlaveIntStatus (Bases、true))// I2CSlaveIntStatus ()返回 true =>如果 I2C 从机中断状态为活动 状态{ //清除从机中断 I2CSlaveIntClear (Bases);//清除 I2C 从机中断源。 //获取 I2C 从 机状态的状态= I2CSlaveStatus (Bases);//获取当前的 I2C 从机中断状态。 数据= I2CSlaveDataGet (Bases);//获取数据(此函数从 I2C 从数据寄存器读取一个字节的数据。) if (status = I2C_SLAVE_ACT_RREQ_FBR)//主设备已发送第一个字节 { //仅在总线空闲 时处理 if (smb[index].state = SMB_IDLE) { smb[index].state = SMB_SLAVE; SMB[index].index = 0; SMB[index].callpeconed= 0; 如果已激活 smb[calebraveindex]、则为 smb[calebraveindex];如果已重新调用 smb[slaveindex].index = smb[slavecount];如果已激活 smb[smb[calebraveback.index //我们只能从从从 smb[index].cmd = I2CSlaveDataGet (Bases)接收字;//第一个字节是命令 if (smb[index].flags & SMB_FLAG_PEC) { smb[index].count += 1; CRC8_add ((uint8 *)&smb[index].timerRestart] ;smb[index](timerRestart]) // else //我们处于某个中间位置,需要先将其丢弃 } //从接收器 else if (status =I2C_SLAVE_ACT_RREQ)//主机已发送数据 { data = I2CSlaveDataGet (Bases);//获取数据 SMB [索引].count-; if (smb[index].count = 0)//接收到的最后一个字节 { if (SMB [索引].flags & SMB_FLAG_PEC)// if PEC -最后一个字节是校验和 SMB [索引].Received= data; SMB [索引].state = SMB_DONE;//我们已完成,需要处理数据 } //如果不是最后一个字节,或者没有启用 PEC ,则需要将字节添加到缓冲区中(((smb[index].count > 0)||(!(smb[index].flags & smb_FLAG_PEC) ){ smb[index].que[sb[index].index+]= data; if (pbpbpb[index].intpec[e].flag](sb[sb[sb[sb[= )、sb[culate].index].index].flag]))) } //从发送器 if (status =I2C_SLAVE_ACT_TREQ)//主设备已请求数据(TREQ 位已设置) { smb_slave_tx_data (index、smb[index].cmd); if (Data_Count_var < Max_I2C_Tx_size)// Max_I2C_Tx_Size 是要发送的最大字节数 { I2CSlaveDataPut (Bases、Data_Tx_Buffer[index][Data_Count_var]);//传输一个字节 Data_Count_var++;//下一个字节的增量 //检查 Tx 是否已完成 if (Data_Count_var = Max_I2C_Tx_Size)//重置标志和其他变量 { DATA_Count_var = 0; smb[索引].state = SMB_IDLE; } } } /********* *实数 I2C 中断处理程序 // 从板 I2C 中断 空 I2C0IntHandler (空)// Bay1 Cella 中断 { I2CHandler (Bay1_Cella _I2C); } void I2C3IntHandler (void)// Bay1 CellB 中断 { I2CHandler (Bay1_CellB_I2C); } void I2C4IntHandler (void)// Bay2 Cella Interrupt { I2CHandler (Bay2_Cella _I2C); } void I2C5IntHandler (void)// Bay2 CellB 中断 { I2CHandler (Bay2_CellB_I2C); } // * main.c * / int main (void) { SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTAL_XTAL_8MHZ);CellC1(Bayella (I2C_USC_USC_UST_OSC );I2C_BIC_BIC/ I2C 从器件地址/I2C B;BIC_BIC_BIC_1、I2C_BITERB;BIC_BIC_BITER2、I2C_BITER2、I2C_BIC_BICE_B、I2C_BITER2、I2C_BIN/ BIC_BIN/ BIT_BIC_BYB、BIN/ BIN/ BIN/ BIN/ BIN/ CLB while (1) { } }
。