在写数据的时候打个断点,然后第一个TXE出现则之后在运行没有问题.若不打断点TXE没有置为,SR1寄存器没有任何反应,直接卡死.
[C] 纯文本查看 复制代码 //初始化
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
//主模式
I2C1->CR2 |= I2C_CR2_FREQ_5 | I2C_CR2_FREQ_4 | I2C_CR2_FREQ_1; //32M
I2C1->CCR &= ~I2C_CCR_FS; //标准模式
I2C1->CCR |= 0xA1 << I2C_CCR_CCR_Pos;
I2C1->TRISE |= 0x21; /* 1/ (1/32) = 32+1*/
I2C1->CR2 |= I2C_CR2_ITBUFEN | I2C_CR2_ITEVTEN |I2C_CR2_ITERREN;//中断使能
I2C1->CR1 |= I2C_CR1_ACK;
I2C1->CR1 |= I2C_CR1_PE;//外设使能
void I2C_Write1(uint8_t Addr, uint8_t* pDat, uint8_t Cnt)
{
uint8_t TxCnt = 0;
while((I2C1->SR2 & I2C_SR2_BUSY) == 1); //总线不忙碌
do{
I2C1->CR1 |= I2C_CR1_START;
while(( I2C1->SR1 & I2C_SR1_SB) == 0) ;
I2C1->DR = 0xA0; //写
while(( I2C1->SR1 & I2C_SR1_TXE) == 0) ;
I2C1->DR = Addr;
}while(( I2C1->SR1 & I2C_SR1_ADDR) == 0);
while(TxCnt < Cnt)
{
// mSDelay(7);
I2C1->DR = pDat[TxCnt];
// while((I2C1->SR1 & I2C_SR1_AF )== 1) I2C1->DR = pDat[TxCnt];
while(( I2C1->SR1 & I2C_SR1_TXE) == 0) ;
TxCnt += 1;
}
I2C1->CR1 |= I2C_CR1_STOP;
}
|