您好、来自德国 Rastatt、
为了集成 EEPROM、我在上述板上开发了 I2C 驱动器
它将保存我们的应用的一些参数数据。
引脚4.1已配置为 UCB1SDA (数据线路)、
引脚4.2保持 I2C 时钟 UCB.S (时钟线)。
我打算使用 UCB1STAT 寄存器中的 BUSY 标志来获得一个合适的时序。
软件基于中的 IAR/TI 示例
IAR 嵌入式工作平台\430\examples\DriverLib examples\MSP430F5xx_6xx\USCI_B_i2c、
项目"USCI_B_i2c_ex3_masterTxSingle.c"
文件"USCI_B_i2c"已重写为"EEP_i2c.c"、但有其不同之处
发送后、忙标志等待复位。
例如、将函数"USCI_B_I2C_masterSendMultiByteStartWithTimeout"返工为
"eep_I2C_masterSendMultiByteStartWithTimeout"。
//================================================
//代码片段:
//================================================
uint8_t EEP_I2C_masterSendMultiByteStartWithTimeout (uint16_t baseAddress、
uint8_t txData、
uint32_t 超时)
{
uint32_t TMO;
TMO =超时;
//存储当前发送中断使能
uint8_t txieStatus = HWREG8 (baseAddress + OFS_UCBxIE)& UCTXIE;
//禁用发送中断使能
HWREG8 (baseAddress + OFS_UCBxIE)&=~(UCTXIE);
//发送启动条件。
HWREG8 (baseAddress + OFS_UCBxCTL1)|= UCTR + UCTXSTT;
//轮询发送中断标志。
while ((!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG))&-TMO)
{
;
}
//检查传输是否超时
if (TMO = 0)
{
返回(STATUS_IFG1);
}
//================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//==>到目前为止、代码是从原始代码中接管的:
//发出启动事件,发送从器件地址...
//================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
TMO =超时;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//程序将在下面的循环中挂起,因为忙状态仍然存在(如果未注释掉!)。
//这应确保在总线再次就绪之前不会完成下一个传输!
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
while ((HWREG8 (baseAddress + OFS_UCBxSTAT)& UCBBUSY)&&-TMO)
{
;
}
//检查传输是否超时
if (TMO = 0)
{
返回((uint8_t) STATUS_BSY);
}
//================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//==>添加了此代码... 等待线路状态更改为"非忙"
//================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//发送单字节数据。
HWREG8 (baseAddress + OFS_UCBxTXBUF)= txData;
//恢复发送中断使能
HWREG8 (baseAddress + OFS_UCBxIE)|= txieStatus;
return ((uint8_t) status_Success);
//================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//=>再次原始代码... 发送要写入 EEPROM 的地址的第一个字节...
//不要发送“停止”事件! (防止地址字节被写入 EEPROM)。
//================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
}
//================================================
//代码片段结束
//================================================
下一个地址字节以及所有后续数据字节将被发送到 EEP 内部
缓冲器、直到停止事件触发将数据字节写入指定的地址
发送的前2个字节。
注释掉忙线检查代码、然后在之间插入长延迟时间间隔(请参阅下面的代码)
单个函数调用使事情正常工作--尽管线路一直处于繁忙状态,直到发送停止事件。
=>但是、这当然会使过程太慢、无法在真实项目中使用!
//================================================
//代码片段2.
//================================================
uint8_t EEPROReadPage (uint16_t 地址、uint8_t * pui8RcvBuf、uint8_t 长度、uint32_t 超时)
{
(笑声)
(笑声)
adrLo =(uint8_t)(地址和0x00FF);
adrHi =(uint8_t)((地址和0xFF00)>> 8);
RetVal = EEP_I2C_masterSendMultiByteStartWithTimeout (USCI_B1_base、adrHi、timeout);
if (retval!= STATUS_SUCCESS){while (1);}
//=>等待很长...
{cntr= delay;while ( cntr --);}
RetVal = EEP_I2C_masterSendMultiByteNextWithTimeout (USCI_B1_base、adrLo、timeout);
if (retval!= STATUS_SUCCESS){while (1);}
//=>等待很长...
{cntr= delay;while ( cntr --);}
eep_I2C_ReceivmasterMultiByteStart (USCI_B1_base);
//=>等待很长...
{cntr= delay;while ( cntr --);}
for (bufNdx=0;bufNdx<NCHARS -1;bufNdx++)
{
RcvBuf[bufNdx]= EEP_I2C_masterReceiveMultiByteNext (USCI_B1_base);
//=>等待很长...
{cntr= delay;while ( cntr --);}
}
...
(笑声)
//================================================
//代码片段2结束
//================================================
问题是 :为什么发送后忙状态仍然存在?
是否有权变措施(即获取适当时序的另一种方法)?
谢谢、大家好
Goetz
Goetz