STM8S001 I2C 设备读取

//I2C初始化
void I2c_Init(void)
{
	CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C,ENABLE);
	I2C_DeInit();
	I2C_Init(100000,0x10, I2C_DUTYCYCLE_2,I2C_ACK_CURR,I2C_ADDMODE_7BIT,16);
	I2C_Cmd(ENABLE);
}


//I2C读
void I2c_Read(uint16_t Addr,uint8_t *Data,uint8_t len)
{
	char i=0;
	while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
	{
		delay(50);
		i++;
		if(i>3)
		{
			return ;
		}
	}
	/*开始*/
	//使能ACK
	I2C_AcknowledgeConfig(I2C_ACK_CURR);
	I2C_GenerateSTART(ENABLE);
	while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

	/*设备地址写*/
	I2C_Send7bitAddress(SLAVEADDR,I2C_DIRECTION_TX);
	while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

	/*数据地址*/
	I2C_SendData((uint8_t)(Addr>>8));
	
	while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
	
	I2C_SendData((uint8_t)(Addr&0x00FF));
	
	while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));


	/*重新开始*/
	I2C_GenerateSTART(ENABLE);
	while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

	/*设备地址/读*/

	I2C_Send7bitAddress(SLAVEADDR,I2C_DIRECTION_RX);

	while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

	/*读字节数据*/

	for(i=0;i<len;i++)
	{
		while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
		*(Data+i) = I2C_ReceiveData();
	}
	I2C_AcknowledgeConfig(I2C_ACK_NONE);
	
	/* 停止 */
	I2C_GenerateSTOP(ENABLE);
}

时钟频率为16M

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值