📄 i2c_24cxx.c
字号:
/*****************************************************************************
用51单片机读写I2C总线存储器24CXX的程序
最近更新日期:
2004-3-24 16:41 基本功能在AT24C02,AT24C16上调试通过
2005-1-20 8:56 为了让本程序能用于多任务系统,为其增加临界区保护措施
(即OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL())
*****************************************************************************/
#include "..\..\includes.h"
#if CFG_I2C_24CXX_EN > 0
//-------------------------------------------------------------------------
// 向没有器件内部子地址的器件发送一个字节数据
//
// 参数:
// slaveAddress 器件地址
// ch 要发送的数据
//
// 返回值:
// 如果发送数据成功,返回TRUE;否则,返回FALSE
//-------------------------------------------------------------------------
extern BOOLEAN I2C_WriteByte( INT8U slaveAddress, INT8U ch )
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
// 因为这是写操作,所以要将slaveAddress的bit0设置为0
slaveAddress &= 0xfe;
I2C_Start(); // 启动I2C总线
if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
{
OS_EXIT_CRITICAL();
return FALSE;
}
if( I2C_SendByte( ch ) == FALSE ) // 发送数据
{
OS_EXIT_CRITICAL();
return FALSE;
}
I2C_Stop(); // 结束I2C总线
OS_EXIT_CRITICAL();
return TRUE;
}
//-------------------------------------------------------------------------
// 向有器件内部子地址的器件发送多字节数据
//
// 参数:
// slaveAddress 器件地址
// startAddress 器件的内部子地址
// *str 要发送多字节数据
// length 发送的多字节数据长度
//
// 返回值:
// 如果发送多字节数据成功,函数返回TRUE;失败,函数返回FALSE
//-------------------------------------------------------------------------
extern BOOLEAN I2C_WriteMultiBytes( INT8U slaveAddress,
INT8U startAddress,
INT8U *str,
INT8U length )
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U i;
OS_ENTER_CRITICAL();
// 因为这是写操作,所以要将slaveAddress的bit0设置为0
slaveAddress &= 0xfe;
I2C_Start(); // 启动I2C总线
if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
{
OS_EXIT_CRITICAL();
return FALSE;
}
if( I2C_SendByte( startAddress ) == FALSE ) // 发送器件的内部子地址
{
OS_EXIT_CRITICAL();
return FALSE;
}
// 发送多字节数据
for( i=0; i<length; i++ )
{
if( I2C_SendByte( str[i] ) == FALSE )
{
OS_EXIT_CRITICAL();
return FALSE;
}
}
I2C_Stop(); // 结束I2C总线
OS_EXIT_CRITICAL();
return TRUE;
}
//-------------------------------------------------------------------------
// 从没有器件内部子地址的器件中读取一个字节数据
//
// 参数:
// slaveAddress 器件地址
// *ch 保存读取的数据
//
// 返回值:
// 如果读取数据成功,函数返回TRUE, 用形参*ch保存读取的数据
// 如果读取数据失败,函数返回FALSE,形参*ch为0
//-------------------------------------------------------------------------
extern BOOLEAN I2C_ReadByte( INT8U slaveAddress, INT8U *ch )
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
// 因为这是读操作,所以要将slaveAddress的bit0设置为1
slaveAddress |= 0x01;
I2C_Start(); // 启动I2C总线
if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
{
OS_EXIT_CRITICAL();
return FALSE;
}
*ch = I2C_ReceiveByte(); // 读取数据
I2C_UnACK(); // 发送非ACK应答信号
I2C_Stop(); // 结束I2C总线
OS_EXIT_CRITICAL();
return TRUE;
}
//-------------------------------------------------------------------------
// 从有器件内部子地址的器件中读取多字节数据
//
// 参数:
// slaveAddress 器件地址
// startAddress 器件的内部子地址
// *str 读取的多字节数据保存到str指向的存储空间
// length 要读取的多字节数据长度
//
// 返回值:
// 如果读取多字节数据成功,函数返回TRUE;失败,函数返回FALSE
//-------------------------------------------------------------------------
extern BOOLEAN I2C_ReadMultiBytes( INT8U slaveAddress,
INT8U startAddress,
INT8U *str,
INT8U length )
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U i;
if( length==0 )
return FALSE;
OS_ENTER_CRITICAL();
// 执行一次虚拟写操作
// 因为首先要虚拟写,所以要将slaveAddress的bit0设置为0
slaveAddress &= 0xfe;
I2C_Start(); // 启动I2C总线
if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
{
OS_EXIT_CRITICAL();
return FALSE;
}
if( I2C_SendByte( startAddress ) == FALSE ) // 发送器件的内部子地址
{
OS_EXIT_CRITICAL();
return FALSE;
}
// 再一次启动
// 这次启动才是真正的读,所以,要将slaveAddress的bit0设置为1
slaveAddress |= 0x01;
I2C_Start(); // 启动I2C总线
if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
{
OS_EXIT_CRITICAL();
return FALSE;
}
// 接收多字节数据
for( i=0; i<length-1; i++ )
{
str[i] = I2C_ReceiveByte(); // 读取数据
I2C_ACK();
}
str[i] = I2C_ReceiveByte(); // 读取数据
I2C_UnACK();
I2C_Stop(); // 结束I2C总线
OS_EXIT_CRITICAL();
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -