工具/软件:Code Composer Studio
早上好。
我配置了 I2C 模块设置 GPIO (有外部上拉电阻器)并执行以下初始化:
void I2CB_Init (void) { //初始化 I2C GPIO I2CB_Init_GPIO (); //初始化 I2C-B 模块 I2cbRegs.I2CMDR.bit.IRS = 0; // DB -重置 I2C 模块以进行设置[TMR 页 2034] I2cbRegs.I2CSAR.ALL = 0x0000; //从地址 //预分频器-模块时钟需要7-12MHz // I2cbRegs.I2CPSC.all = 27; // DB - PERx.SYSCLK/(IPSC+1)= 7.14MHz @200MHz [ TMR 页 2034 7-12MHz 正常] I2cbRegs.I2CCLKL = 8; //注:必须为非零 I2cbRegs.I2CCLKH=7; //注:必须为非零 // T=1/7.14MHz*[(ICLKL+d)+(ICLKH+d)]= 3、5us @ 286kbps @ d=5 - IPSC > 1 [ TMR 页。 2035] // I2cbRegs.I2CIER.all = 0x24; //启用 SCD 和 ARDY __interrupts *// T = 1/11.76MHz*[(ICLKL+d)+(ICLKH+d)]= 5、014us @ 199、4kbps @ d = 5 - IPSC > 1 I2cbRegs.I2CPSC.all = 16; // DB - PERx.SYSCLK/(IPSC+1)= 11.76MHz @200MHz [ TMR 页 2034 7-12MHz 正常] I2cbRegs.I2CCLKL = 19; //注:必须为非零 I2cbRegs.I2CCLKH = 30; //注:必须为非零 I2cbRegs.I2CIER.ALL = 0x0000; //不启用中断 I2cbRegs.I2CMDR.bit.XA = 0; // DB - 7位地址 I2cbRegs.I2CMDR.bit.FDF = 0; // DB -无自由数据格式 // I2cbRegs.I2COAR.bit.OAR = 1; // DB -从机模式中的所有者地址 // I2cbRegs.I2CSAR.bit.SAR = 1; // DB -主控模式中的从器件地址 I2cbRegs.I2CMDR.bit.DLB = 0; // DB -禁用环回模式 I2cbRegs.I2CMDR.bit.FREE = 1; // DB -自由模式 I2cbRegs.I2CMDR.bit.MST = 1; // DB -主模式 I2cbRegs.I2CFFTX.bit.TXFFRST = 0;// BB -复位 TX FIFO I2cbRegs.I2CFFTX.bit.I2CFFEN = 1;// DB -设置 Tx FIFO 模式 I2cbRegs.I2CFFTX.bit.TXFFIL = 15;// DB - Tx FIFO 电平 I2cbRegs.I2CFFTX.bit.TXFFRST = 1;// DB -禁用 Tx FIFO I2cbRegs.I2CFFTX.bit.TXFFIENA=0;// DB -禁用 TX FIFO 中断 I2cbRegs.I2CFFTX.bit.TXFFRST = 1;// BB -释放复位 TX FIFO I2cbRegs.I2CFFRX.bit.RXFFRST = 0;// BB -复位 RX FIFO I2cbRegs.I2CFFRX.bit.RXFFIL = 15;// DB - Rx FIFO 电平 I2cbRegs.I2CFFRX.bit.RXFFINTCLR = 1;// DB -清除 FFIntFlag I2cbRegs.I2CFFRX.bit.RXFFRST = 1;// DB -禁用 Rx FIFO I2cbRegs.I2CFFRX.bit.RXFFIENA=0;// DB -禁用 RX FIFO 中断 I2cbRegs.I2CFFRX.bit.RXFFRST = 1;// BB -释放复位 RX FIFO I2cbRegs.I2CMDR.bit.IRS = 1; // DB -重新复位到 I2C 模块 }
遗憾的是、我尝试修改 I2C 的速度以解决我想要解释的问题(请参阅两种速度配置)、该问题受支持
范围。 我执行的第一个操作是执行以下函数:
I2CB_EE_write16 ((unsigned int)(ptR_measure_begin +(ptR_abs_time_H * 2))、(unsigned int) 0x1111);
其中定义为:
unsigned int I2CB_EE_write16 (unsigned int EE_addr、unsigned int data_Byte) { unsigned int I2C_error; I2C_ERROR = I2CB_EE_write8 (EE_addr、(DATA_BYTE 和0x00FF); DELAY_US (500L);//延迟以最小化 I2C_ERROR = I2CB_EE_write8 (EE_addr + 1、(DATA_BYTE & 0xFF00)>> 8); DELAY_US (500L);//延迟以最小化 返回1; }
当然、我希望及时执行两个8位 EE 文章。 这个8位 EE 写入函数是:
unsigned int I2CB_EE_write8 (unsigned int EE_addr、unsigned int data_Byte) { #define RESET_I2C_TIMEOUT 0x0FFF unsigned int I2C_ERROR、I2C_TIMEOUT; //禁用写保护线 GpioDataRegs.GPCCLEAR.bit.GPIO82=1; //等待直到 STP 位从任何先前的主设备通信中清零。 //模块清除该位的操作被延迟到 SCD 位之后 //设置。 如果在启动新消息之前未选中此位 // I2C 可能会被混淆。 // I2C_TIMEOUT = RESET_I2C_TIMEOUT; while (I2cbRegs.I2CMDR.bit.STP &&(I2C_TIMEOUT > 0)) I2C_TIMEOUT--; if (I2C_TIMEOUT = 0) 返回 I2C_BUS_BUS_BUSY_ERROR; //设置从地址 I2cbRegs.I2CSAR.all = EEPROM_I2C_ADDRESS; //检查总线是否占线 I2C_TIMEOUT = RESET_I2C_TIMEOUT; while (I2cbRegs.I2CSTR.bit.bb &&(I2C_TIMEOUT > 0)) I2C_TIMEOUT--; if (I2C_TIMEOUT = 0) 返回 I2C_BUS_BUS_BUSY_ERROR; //设置要发送的字节数 //控制字节+地址 H & L I2cbRegs.I2CCNT = 3; //设置要发送的数据 I2cbRegs.I2CDXR.ALL =((EE_addr >> 8)& 0x00FF); I2cbRegs.I2CDXR.All =(EE_addr & 0x00FF); I2cbRegs.I2CDXR.ALL = DATA_BYTE; //将 START 作为带有 STOP 的主发送器发送 I2cbRegs.I2CMDR.ALL = 0xEE20; // DB - NACKMOD[15]= X ->在从器件中生成 ACK [X if in TX Mode] // DB - free[14]= 1 ->在断点上自由运行 // DB - STT[13] = 1 ->在主模式下生成 START // DB -保留= 0 // DB - STP[11] = 1 ->停止由模块生成 // DB - MST[10] = 1 ->主机模式被启用 // DB - TRX[9] = 1 -> Tx 模式被启用 // DB - XA[8] = 0 -> 7位地址 // DB - Rm[7] = 0 ->无重复模式 // DB - DLB[6] = 0 ->环回模式 // DB - IRS[5] = 1 -> I2C 模块被启用 // DB - STB[4] = 0 ->无起始字节 // DB - FDF[3] = 0 ->无自由数据模式; // DB - BC[2-0] = 000 -> 8位; //激活写保护行 DELAY_US (300); GpioDataRegs.GPCSET.BIT.GPIO82=1; 返回1; }
如果我在两个 I2CB_EE_write8按顺序执行时执行 I2CB_EE_write16、我会注意到、在执行第二个写入操作后、
I2C 总线未释放。 如果我执行一次断点一个 I2CB_EE_write8、EE 写入过程将正确执行。 我也是如此
认为代码是正确的、但出于同样的异步原因、存在会阻止第二次后时钟 I2C 模块生成的 someings
写入操作:I2C 总线保持低电平、尽管我执行了它希望在发送3后生成停止条件的同一 I2CMDR 字
字节(请参阅示波器:两个相对的一个单独的著作和一个 togheter);不幸的是、在第二个写入中、只有控制字节退出...
希望您能为您提供帮助。
此致。
迭戈·贝拉希马
P.S.:请遵循示波器。
两篇8b EE 文章 togheter [isse].bmp 
第1个8b EE 写入[I2C 总线已释放].bmp
2ST 8b EE 写入[I2C 总线已释放].bmp

