微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 的I2C 硬使用

STM32 的I2C 硬使用

时间:12-03 来源:互联网 点击:

#else
I2C_Send7bitAddress(I2C1, addr<1, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
#endif

/* 写一个字节*/
I2C_SendData(I2C1, dat);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* 停止位*/
I2C_GenerateSTOP(I2C1, ENABLE);

I2C_Standby_24C();
}

/*************************************************
**函数名:I2C_PageWrite_24C
**功能:写入一页(以内)
**注意事项:此函数供群写入调用
*************************************************/
void I2C_PageWrite_24C(u8 addr,u8* pBuffer, u8 no)
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

/*起始位*/
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

#ifdef AT24C01A
/*器件地址(写)*/
I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

/*写地址值*/
I2C_SendData(I2C1, addr);
while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

#else
I2C_Send7bitAddress(I2C1, addr<1, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
#endif
while(no--)
{
I2C_SendData(I2C1, *pBuffer);
pBuffer++;
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}

/*停止位*/
I2C_GenerateSTOP(I2C1, ENABLE);
}

/*************************************************
**函数名:I2C_WriteS_24C
**功能:页写入24C
**注意事项:24C02最多允许一次写入8个字节
*************************************************/
void I2C_WriteS_24C(u8 addr,u8* pBuffer, u16 no)
{
u8 temp;

//1.先把页不对齐的部分写入
temp=addr % I2C_PAGESIZE;
if(temp)
{
temp=I2C_PAGESIZE-temp;
I2C_PageWrite_24C(addr,pBuffer, temp);
no-=temp;
addr+=temp;
pBuffer+=temp;
I2C_Standby_24C();
}
//2.从页对齐开始写
while(no)
{
if(no>=I2C_PAGESIZE)
{
I2C_PageWrite_24C(addr,pBuffer, I2C_PAGESIZE);
no-=I2C_PAGESIZE;
addr+=I2C_PAGESIZE;
pBuffer+=I2C_PAGESIZE;
I2C_Standby_24C();
}
else
{
I2C_PageWrite_24C(addr,pBuffer, no);
no=0;
I2C_Standby_24C();
}
}
}

//测试用
void I2C_Test(void)
{
u8 i;
u8 I2c_Buf[128];

I2C_Standby_24C();

//填充缓冲
for(i=0;i<128;i++)
I2c_Buf[i]=i;

//写
I2C_WriteS_24C(1,I2c_Buf,120);

//清缓冲
for(i=0;i<128;i++)
I2c_Buf[i]=0;

//读
I2C_ReadS_24C(1,I2c_Buf,80);

for(i=1;i<120;i++)
{
if(I2c_Buf[i]!=i)
{
while(1);
}
}

}

就看这里 确定是否正常~!

其实 都是 while 这种 硬等待 导致屡次调不通 务必加入 超时判断。

简单的像

i=0;

while((!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))&&i<12000);i++

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top