#include "stm32f10x.h"
void My_I2C_Init(void);
int My_I2C_SendButes(I2C_TypeDef*I2Cx,uint8_t Addr,uint8_t *pData,uint16_t Size);
int main(void)
{
My_I2C_Init();
uint8_t pData[]={0xAE,0x20,0x10,0xb0,0xc8};
My_I2C_SendButes(I2C1,0X78,pData,sizeof(pData)/sizeof(uint8_t));
while(1)
{
}
}
void My_I2C_Init(void)
{
//对I2C1进行重映射
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_I2C1,ENABLE);
//io引脚初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//初始化I2C模块
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,DISABLE);
I2C_InitTypeDef I2C_InitStruct;
I2C_InitStruct.I2C_ClockSpeed=400000;
I2C_InitStruct.I2C_Mode=I2C_Mode_I2C;
I2C_InitStruct.I2C_DutyCycle=I2C_DutyCycle_2;
I2C_Init(I2C1,&I2C_InitStruct);
I2C_Cmd(I2C1,ENABLE);
}
int My_I2C_SendButes(I2C_TypeDef*I2Cx,uint8_t Addr,uint8_t *pData,uint16_t Size)
{
//等待总线空闲
while(I2C_GetFlagStatus(I2Cx,I2C_FLAG_BUSY)==SET);
//发送起始位
I2C_GenerateSTART(I2Cx,ENABLE);
while(I2C_GetFlagStatus(I2Cx,I2C_FLAG_SB)==RESET);
//寻址阶段
I2C_ClearFlag(I2Cx,I2C_FLAG_AF);
I2C_SendData(I2Cx,Addr&0xfe);
while(1)
{
if(I2C_GetFlagStatus(I2Cx,I2C_FLAG_ADDR)==SET)
{
break;
}
if(I2C_GetFlagStatus(I2Cx,I2C_FLAG_AF)==SET)
{
I2C_GenerateSTOP(I2Cx,ENABLE);
return -1;
}
}
I2C_ReadRegister(I2Cx,I2C_Register_SR1);
I2C_ReadRegister(I2Cx,I2C_Register_SR2);
//发送数据
for(uint16_t i=0;i<Size;i++)
{
while(1)
{
if(I2C_GetFlagStatus(I2Cx,I2C_FLAG_AF==SET))
{
I2C_GenerateSTOP(I2Cx,ENABLE);
return -2;
}
if(I2C_GetFlagStatus(I2Cx,I2C_FLAG_TXE==SET))
{
break;
}
}
}
while(1)
{
if(I2C_GetFlagStatus(I2Cx,I2C_FLAG_AF==SET))
{
I2C_GenerateSTOP(I2Cx,ENABLE);
return -2;
}
if(I2C_GetFlagStatus(I2Cx,I2C_FLAG_BTF==SET))
{
break;
}
}
I2C_GenerateSTOP(I2Cx,ENABLE);
return -2;
}
这段程序有什么错误