FwLib_STC8
FwLib_STC8 copied to clipboard
FwLib_STC8\src\fw_i2c.c封装函数简化想法
- 针对读取AT24Cxx函数简化,对于AT24C32以下容量的读写是8位地址,AT24C32及以上容量的16位地址位,直接使用宏来区分所需操作的AT24Cxx器件的地址位。可以将现有区分的读写操作函数,合成通用的读写函数。
源文件:FwLib_STC8\src\fw_i2c.c
:
// Copyright 2021 IOsetting <iosetting(at)outlook.com>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "fw_i2c.h"
uint8_t I2C_Write(uint8_t devAddr, uint8_t memAddr, uint8_t *dat, uint16_t size)
{
SFRX_ON();
I2C_MasterStart();
I2C_MasterSendData(devAddr & 0xFE);
I2C_MasterRxAck();
I2C_MasterSendData(memAddr);
I2C_MasterRxAck();
while(size--)
{
I2C_MasterSendData(*dat++);
I2C_MasterRxAck();
}
I2C_MasterStop();
SFRX_OFF();
return HAL_OK;
}
uint8_t I2C_Read(uint8_t devAddr, uint8_t memAddr, uint8_t *buf, uint16_t size)
{
SFRX_ON();
I2C_MasterStart();
I2C_MasterSendData(devAddr & 0xFE);
I2C_MasterRxAck();
I2C_MasterSendData(memAddr);
I2C_MasterRxAck();
I2C_MasterStart();
I2C_MasterSendData(devAddr | 0x01);
I2C_MasterRxAck();
while(size--)
{
I2C_SendMasterCmd(I2C_MasterCmd_Recv);
*buf++ = I2CRXD;
if (size == 0)
{
I2C_MasterNAck();
}
else
{
I2C_MasterAck();
}
}
I2C_MasterStop();
SFRX_OFF();
return HAL_OK;
}
uint8_t I2C_Write16BitAddr(uint8_t devAddr, uint16_t memAddr, uint8_t *dat, uint16_t size)
{
SFRX_ON();
I2C_MasterStart();
I2C_MasterSendData(devAddr & 0xFE);
I2C_MasterRxAck();
I2C_MasterSendData(memAddr >> 8);
I2C_MasterRxAck();
I2C_MasterSendData(memAddr & 0xFF);
I2C_MasterRxAck();
while(size--)
{
I2C_MasterSendData(*dat++);
I2C_MasterRxAck();
}
I2C_MasterStop();
SFRX_OFF();
return HAL_OK;
}
uint8_t I2C_Read16BitAddr(uint8_t devAddr, uint16_t memAddr, uint8_t *buf, uint16_t size)
{
SFRX_ON();
I2C_MasterStart();
I2C_MasterSendData(devAddr & 0xFE);
I2C_MasterRxAck();
I2C_MasterSendData(memAddr >> 8);
I2C_MasterRxAck();
I2C_MasterSendData(memAddr & 0xFF);
I2C_MasterRxAck();
I2C_MasterStart();
I2C_MasterSendData(devAddr | 0x01);
I2C_MasterRxAck();
while(size--)
{
I2C_SendMasterCmd(I2C_MasterCmd_Recv);
*buf++ = I2CRXD;
if (size == 0)
{
I2C_MasterNAck();
}
else
{
I2C_MasterAck();
}
}
I2C_MasterStop();
SFRX_OFF();
return HAL_OK;
}
- 简化通用操作函数:
#include "fw_i2c.h"
/* EERPOM DATA ADDRESS Length Definition */
#define Address_8bit 0
#define Address_16bit 1
/* EERPOM DATA ADDRESS Length Selection */
//#define Address_Lenth Address_8bit
#define Address_Lenth Address_16bit
uint8_t I2C_Write(uint8_t devAddr, uint8_t memAddr, uint8_t *dat, uint16_t size)
{
SFRX_ON();
I2C_MasterStart();
I2C_MasterSendData(devAddr & 0xFE);
I2C_MasterRxAck();
#if (Address_Lenth == Address_8bit)
I2C_MasterSendData(memAddr);
I2C_MasterRxAck();
#elif (Address_Lenth == Address_16bit)
I2C_MasterSendData(memAddr >> 8);
I2C_MasterRxAck();
I2C_MasterSendData(memAddr & 0xFF);
I2C_MasterRxAck();
#endif
while(size--)
{
I2C_MasterSendData(*dat++);
I2C_MasterRxAck();
}
I2C_MasterStop();
SFRX_OFF();
return HAL_OK;
}
uint8_t I2C_Read(uint8_t devAddr, uint8_t memAddr, uint8_t *buf, uint16_t size)
{
SFRX_ON();
I2C_MasterStart();
I2C_MasterSendData(devAddr & 0xFE);
I2C_MasterRxAck();
#if (Address_Lenth == Address_8bit)
I2C_MasterSendData(memAddr);
I2C_MasterRxAck();
I2C_MasterStart();
I2C_MasterSendData(devAddr | 0x01);
I2C_MasterRxAck();
#elif (Address_Lenth == Address_16bit)
I2C_MasterSendData(memAddr >> 8);
I2C_MasterRxAck();
I2C_MasterSendData(memAddr & 0xFF);
I2C_MasterRxAck();
I2C_MasterStart();
I2C_MasterSendData(devAddr | 0x01);
I2C_MasterRxAck();
#endif
while(size--)
{
I2C_SendMasterCmd(I2C_MasterCmd_Recv);
*buf++ = I2CRXD;
if (size == 0)
{
I2C_MasterNAck();
}
else
{
I2C_MasterAck();
}
}
I2C_MasterStop();
SFRX_OFF();
return HAL_OK;
}