📄 open_i2c.c
字号:
#include <io.h>
#include "system.h"
#include "Open_I2C.h"
//-------------------------------------------------------------------------
unsigned int I2C_Read_Period()
{
unsigned char low,high;
low = IORD(I2C_0_BASE,I2C_PRER_LO);
high= IORD(I2C_0_BASE,I2C_PRER_HI);
return (high<<16)+low;
}
//-------------------------------------------------------------------------
unsigned char I2C_Read_Ctrl()
{
return IORD(I2C_0_BASE,I2C_CTR);
}
//-------------------------------------------------------------------------
unsigned char I2C_Read_RX()
{
return IORD(I2C_0_BASE,I2C_RXR);
}
//-------------------------------------------------------------------------
unsigned char I2C_Read_Status()
{
return IORD(I2C_0_BASE,I2C_SR);
}
//-------------------------------------------------------------------------
void I2C_Write_Period(unsigned int Period)
{
IOWR(I2C_0_BASE,I2C_PRER_LO,Period&0xFF);
IOWR(I2C_0_BASE,I2C_PRER_HI,Period>>16);
}
//-------------------------------------------------------------------------
void I2C_Write_Ctrl(unsigned char value)
{
IOWR(I2C_0_BASE,I2C_CTR,value);
}
//-------------------------------------------------------------------------
void I2C_Write_TX(unsigned char value)
{
IOWR(I2C_0_BASE,I2C_TXR,value);
}
//-------------------------------------------------------------------------
void I2C_Write_CMD(unsigned char value)
{
IOWR(I2C_0_BASE,I2C_CR,value);
}
//-------------------------------------------------------------------------
void I2C_Init(unsigned int Period)
{
I2C_Ctrl_Reg a;
I2C_Write_Period(Period);
a.I2C_Ctrl_Flags.CORE_ENABLE=1;
a.I2C_Ctrl_Flags.INT_ENABLE=1;
a.I2C_Ctrl_Flags.RESERVED=0;
I2C_Write_Ctrl(a.Value);
}
//-------------------------------------------------------------------------
unsigned char I2C_Send(unsigned char value,unsigned char STA,unsigned char STO)
{
unsigned char ACK;
I2C_CMD_Reg I2C_CMD;
I2C_Status_Reg I2C_Status;
I2C_Write_TX(value);
I2C_CMD.Value=0;
if(STA!=0)
I2C_CMD.I2C_CMD_Flags.STA=1;
if(STO!=0)
I2C_CMD.I2C_CMD_Flags.STO=1;
I2C_CMD.I2C_CMD_Flags.WR=1;
I2C_Write_CMD(I2C_CMD.Value);
do
{
I2C_Status.Value=I2C_Read_Status();
}
while(I2C_Status.I2C_Status_Flags.TIP);
if(!I2C_Status.I2C_Status_Flags.RXACK)
ACK=1;
else
ACK=0;
return ACK;
}
//-------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -