void I2C_EV_IRQHandler(void) { extern u16 Voltage; extern u16 n; extern u16 V[]; int i=0; switch (I2C_GetLastEvent(I2C1) ) { case I2C_EVENT_MASTER_MODE_SELECT: I2C_Send7bitAddress(I2C1, 0x86, I2C_Direction_Transmitter); break; case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: I2C_SendData(I2C1, V); i++; break; case I2C_EVENT_MASTER_BYTE_TRANSMITTING: break; case I2C_EVENT_MASTER_BYTE_TRANSMITTED: if(i |
RE:iic 中断处理 求助
回复:iic 中断处理 求助【悬赏问答】
是怎么情况呢?描述清楚点吗!
两块stm32f107的板子,A采集ADC,通过iic传给B,B通过串口在PC上打印出电压值。直接将AB的SCL,SDA脚连接在一起。
应该是IIC通信没成功,B并未能接收到A传过来的值。
不知道我的中断处理函数有问题没,高手帮忙看一看,谢谢
回复:iic 中断处理 求助【悬赏问答】
此程序使用中。。。。。
void I2C_Configuration(void)
{
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure I2C1 pins: SCL PB6 and SDA PB7 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure PB8as Output push-pull */
/*PB8--I2C1_AT24C02_WP;*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* I2C1 configuration ------------------------------------------------------*/
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0XA4;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_Cmd(I2C1, ENABLE);
I2C_Init(I2C1, &I2C_InitStructure);
I2C_AcknowledgeConfig(I2C1, ENABLE);/*允许1字节1应答模式*/
}
/*******************************************************************************
* Function Name : 写一个字节
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void I2C_WriteByte(uint8_t Byte, uint16_t WriteAddr, uint8_t EE_Block )
{
/* 起始位 */
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/*发送器件地址(写)*/
I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/*发送地址*/
I2C_SendData(I2C1, (uint8_t)((WriteAddr & 0xFF00) >> 8)); //地址高字节
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, (uint8_t)(WriteAddr & 0x00FF)); //地址低字节
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
/*写一个字节*/
I2C_SendData(I2C1, Byte);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/*停止位*/
I2C_GenerateSTOP(I2C1, ENABLE);
Standby(EE_Block);
}
/*******************************************************************************
* Function Name : 读一个字节
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
uint8_t I2C_ReadByte(uint16_t ReadAddr, uint8_t EE_Block )
{
uint8_t Byte;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
/* 发送起始位 */
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
/*发送器件地址(写)*/
I2C_Send7bitAddress(I2C1, EE_Block , I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/*发送地址*/
I2C_SendData(I2C1, (uint8_t)((ReadAddr & 0xFF00) >> 8)); //地址高字节
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, (uint8_t)(ReadAddr & 0x00FF)); //地址低字节
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
/*起始位*/
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/*器件读*/
I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
I2C_AcknowledgeConfig(I2C1, DISABLE); //最后一位后要关闭应答的
I2C_GenerateSTOP(I2C1, ENABLE); //发送停止位
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */
Byte = I2C_ReceiveData(I2C1);
//再次允许应答模式
I2C_AcknowledgeConfig(I2C1, ENABLE);
return Byte ;
}
/*******************************************************************************
* Function Name : 写铁电
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void I2C_FM_Write(uint8_t *pBuffer, uint8_t no, uint16_t WriteAddr, uint8_t EE_Block )
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
/*起始位*/
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/*器件地址(写)*/
I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/*发送地址*/
I2C_SendData(I2C1, (uint8_t)((WriteAddr & 0xFF00) >> 8)); //地址高字节
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, (uint8_t)(WriteAddr & 0x00FF)); //地址低字节
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
while(no--)
{
I2C_SendData(I2C1, *pBuffer);
pBuffer++;
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
/*停止位*/
I2C_GenerateSTOP(I2C1, ENABLE);
}
/*******************************************************************************
* Function Name : 读铁电
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void I2C_FM_Read(uint8_t *pBuffer, uint8_t no, uint16_t ReadAddr, uint8_t EE_Block )
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
/* 发送起始位 */
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
/*发送器件地址(写)*/
I2C_Send7bitAddress(I2C1, EE_Block , I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* Clear EV6 by setting again the PE bit */
I2C_Cmd(I2C1, ENABLE);
/*发送地址*/
I2C_SendData(I2C1, (uint8_t)((ReadAddr & 0xFF00) >> 8)); //地址高字节
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, (uint8_t)(ReadAddr & 0x00FF)); //地址低字节
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
/*起始位*/
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/*器件读*/
I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while (no)
{
if(no==1)
{
I2C_AcknowledgeConfig(I2C1, DISABLE); //最后一位后要关闭应答的
I2C_GenerateSTOP(I2C1, ENABLE); //发送停止位
}
if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) /* EV7 */
{
*pBuffer = I2C_ReceiveData(I2C1);
pBuffer++;
no--;
}
}
//再次允许应答模式
I2C_AcknowledgeConfig(I2C1, ENABLE);
}/*******************************************************************************
* Function Name : 判忙
* Description :
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Standby(uint8_t EE_Block)
{
vu16 Tmp = 0;
do
{
/*起始位*/
I2C_GenerateSTART(I2C1, ENABLE);
/*读SR1*/
Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);
/*器件地址(写)*/
I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Transmitter);
}while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));
I2C_ClearFlag(I2C1, I2C_FLAG_AF);
/*停止位*/
I2C_GenerateSTOP(I2C1, ENABLE);
}
RE:iic 中断处理 求助【悬赏问答】
回复:iic 中断处理 求助【悬赏问答】
I2C如果没有进中断,表示 中断配置有问题,如果没有实现功能,但是进了中断,再查看中断函数
谢谢。的确没进中断。。这是我关于中断的问题https://www.eefocus.com/bbs/article_244_487156.html。不知道哪里没配置好,进不了
回复:iic 中断处理 求助【悬赏问答】
此程序使用中。。。。。
/* Configure I2C1 pins: SCL PB6 and SDA PB7 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
6,7脚不需要重映射吗?和fsmc的时钟重合了吧? 这个时钟我也不知道怎么关的掉,是不是ahb上的sram?不过我关了sram还是会卡在 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));这里。重映射到8,9脚后,会卡在while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));出不来。遇到过这个问题么?还没找到解决办法