📄 msp430-iic.c
字号:
/***************************************
*项目:××××
*模块:I2C.c //I2C 程序模块
*说明:I2C 程序,SCL,及SDA 在主程序中定义为MCUIO
该模块共有:
1,I2CDelay();//延时程序,给I2C 总线提供必要的延时
2,I2CStart();//开始程序
3,I2CStop();//结束程序
4,I2CSendByte();//送一个字节
5,I2CReceiveByte();//接收一个字节
6,I2CReceiveACK();//接受应答信号
7,I2CAcknowledge();//发送应答信号
8,I2CSendWord();//送字
9,I2CReceiveWord();//接受字
10,I2CPageWrite();//发送页
11,I2CReceiveWords();//接收多字
使用MSP430F149 完成该功能,P3.0 作为SCL,P3.1 作为SDA
*作者:DreamHW
*创建日期:2006.09.05
*修改日期:2006.9.14
***************************************/
#include"msp430x14x.h"
//#define SDA P3.1
//#define SCL P3.0
#define SDA_1 P3OUT |= BIT1 //SDA = 1
#define SDA_0 P3OUT &= ~BIT1 //SDA = 0
#define SCL_1 P3OUT |= BIT0 //SCL = 1
#define SCL_0 P3OUT &= ~BIT0 //SCL = 0
#define DIR_IN P3DIR &= ~BIT1 //I/O 口为输入
#define DIR_OUT P3DIR |= BIT1 //SDA 输出数据
#define SDA_IN ((P3IN >> 1) & 0x01)
#define TIME 5 //I2C 时序延时时间
unsigned int uiSendDataBuffer[8];
unsigned int uiReceiveDataBuffer[8];
/****************************************
*FUNCTION NAME: I2CDelay();
*CREATE DATE:2006.09.07
*CREATED BY:DreamHW
*FUNCTION:I2C 总线必要的延时程序
*MODIFY DATE:
*INPUT:n->延时时间数相当于指令周期数
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CDelay(unsigned int n)
{
unsigned int i;
for(i = 0;i < n;i++)
{
;
}
}
/****************************************
*FUNCTION NAME: I2CStart();
*CREATE DATE:2006.09.07
*CREATED BY:DreamHW
*FUNCTION:I2C 总线启动时序
*MODIFY DATE:
*INPUT:nop
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CStart(void)
{
DIR_OUT;
SDA_1;
I2CDelay(TIME);
SCL_1;
I2CDelay(TIME);
SDA_0;
I2CDelay(TIME);
SCL_0;
}
/****************************************
*FUNCTION NAME: I2CStop();
*CREATE DATE:2006.09.07
*CREATED BY:DreamHW
*FUNCTION:I2C 总线停止时序
*MODIFY DATE:
*INPUT:nop
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CStop(void)
{
DIR_OUT;
SDA_0;
I2CDelay(TIME);
SCL_1;
I2CDelay(TIME);
SDA_1;
}
/****************************************
*FUNCTION NAME: I2CSendByte();
*CREATE DATE: 2006.09.08
*CREATED BY:DreamHW
*FUNCTION:I2C 送一个字节的数据
*MODIFY DATE:
*INPUT:ucWRData
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CSendByte(unsigned char ucWRData)
{
DIR_OUT;
unsigned int i;
for(i = 0;i < 8;i++)
{
SCL_0;
I2CDelay(TIME);
if((ucWRData >> 7) & 0x01) SDA_1;//最高位是否为1,为则SDA= 1
else SDA_0; //否则SDA=0
I2CDelay(TIME);
SCL_1;
I2CDelay(TIME);
ucWRData <<= 1; //数据左移一位,进入下一轮送数
}
SCL_0; //
SDA_1; //等待ack
I2CDelay(TIME);
}
/****************************************
*FUNCTION NAME: I2CReceiveACK();
*CREATE DATE: 2006.09.08
*CREATED BY:DreamHW
*FUNCTION:等待接受ACK 信号,完成一次操作
*MODIFY DATE:
*INPUT:nop
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CReceiveACK(void)
{
SCL_1;
I2CDelay(TIME);//
DIR_IN;
while(SDA_IN);
DIR_OUT;
SCL_0;
I2CDelay(TIME);
}
/****************************************
*FUNCTION NAME: I2CReceiveByte();
*CREATE DATE:2006.09.08
*CREATED BY:DreamHW
*FUNCTION:接受一个字节的数据
*MODIFY DATE:
*INPUT:nop
*OUTPUT:ucRDData
*RETURN:ucRDData
****************************************/
unsigned char I2CReceiveByte(void)
{
unsigned char i;
unsigned char ucRDData = 0;//返回值
unsigned char ucDataBit = 0;//每一个clk 接受到的数据
SCL_0;
I2CDelay(TIME);
SDA_1;
DIR_IN;
for(i = 0;i < 8;i++)
{
SCL_1;
I2CDelay(TIME);
ucDataBit = SDA_IN;
I2CDelay(TIME);
ucRDData = ((ucRDData << 1) | ucDataBit);//将数据依次存入ucRDData
SCL_0;
I2CDelay(TIME);
}
return(ucRDData);
}
/****************************************
*FUNCTION NAME: I2CAcknowledge();
*CREATE DATE: 2006.09.08
*CREATED BY:DreamHW
*FUNCTION:接受数据后发送一个ACK 信号
*MODIFY DATE:
*INPUT:nop
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CAcknowledge(void)
{
SCL_0;
DIR_OUT;
SDA_0;
I2CDelay(TIME);
SCL_1;
I2CDelay(TIME);
SCL_0;
}
/****************************************
*FUNCTION NAME: I2CSendWord();
*CREATE DATE:2006.09.12
*CREATED BY:DreamHW
*FUNCTION:送一个双字节程序
*MODIFY DATE:
*INPUT:ucWRAddress`usWRData
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CSendWord(unsigned char ucWRAddress,unsigned int uiWRData)
{
unsigned char ucLowData;
unsigned char ucHighData;
ucLowData = uiWRData & 0x00ff;
uiWRData >>= 8;
ucHighData = uiWRData;
I2CStart();
I2CSendByte(0xa0);
I2CReceiveACK();
I2CSendByte(ucWRAddress);
I2CReceiveACK();
//送数据
I2CSendByte(ucLowData);
I2CReceiveACK();
I2CSendByte(ucHighData);
I2CReceiveACK();
I2CStop();
}
/****************************************
*FUNCTION NAME: I2CReceiveWord();
*CREATE DATE:2006.09.12
*CREATED BY:DreamHW
*FUNCTION:接受双字节程序
*MODIFY DATE:
*INPUT:ucRDAddress
*OUTPUT:uiDataReg
*RETURN:uiDataReg
****************************************/
unsigned int I2CReceiveWord(unsigned char ucRDAddress)
{
unsigned char ucLowData;//接收到的低位数据
unsigned char ucHighData;//接收到的高位数据
unsigned int uiDataReg;//ReceiveWord
//启动送地址
I2CStart();
I2CSendByte(0xa0); //DEVICE DATA :1010_000_0_WRITE
I2CReceiveACK();
I2CSendByte(ucRDAddress);
I2CReceiveACK();
//启动改为读操作
I2CStart();
I2CSendByte(0xa1);//DEVICE DATA:1010_000_0_READ
I2CReceiveACK();
//开始读取数据,先低后高,存入int 型
ucLowData = I2CReceiveByte();
I2CAcknowledge();
ucHighData = I2CReceiveByte();
//结束时没有ACK
I2CStop();
uiDataReg = ucHighData;
uiDataReg <<= 8;
uiDataReg += ucLowData;
I2CDelay(1000);
return (uiDataReg);
}
/****************************************
*FUNCTION NAME: I2CReceiveWords()
*CREATE DATE:2006.09.12
*CREATED BY:DreamHW
*FUNCTION:送多个字程序
*MODIFY DATE:
*INPUT:ucRDAddress
*OUTPUT:uiReceiveDataBuffer[]
*RETURN:nop
****************************************/
void I2CReceiveWords(unsigned char ucRDAddress)
{
unsigned char ucLowData;
unsigned char ucHighData;
unsigned int i;
//启动方式输入,输入地址
I2CStart();
I2CSendByte(0xa0);
I2CReceiveACK();
I2CSendByte(ucRDAddress);
I2CReceiveACK();
//启动改为读操作
I2CStart();
I2CSendByte(0xa1);//DEVICE DATA:1010_000_0_READ
I2CReceiveACK();
//读取数据将数据放入uiReceiveDataBuffer[]
for(i = 0;i < 7;i++)
{
ucLowData = I2CReceiveByte();
I2CAcknowledge();
ucHighData = I2CReceiveByte();
I2CAcknowledge();
uiReceiveDataBuffer[i] = (ucHighData << 8) + ucLowData;
}
ucLowData = I2CReceiveByte();
I2CAcknowledge();
ucHighData = I2CReceiveByte();
//结束时没有ACK
I2CStop();
uiReceiveDataBuffer[7] = (ucHighData << 8) + ucLowData;
I2CDelay(1000);
}
/****************************************
*FUNCTION NAME: I2CPageWrite();
*CREATE DATE:2006.09.12
*CREATED BY:DreamHW
*FUNCTION:页写程序
*MODIFY DATE:
*INPUT:ucRDAddress;uiSendData[]
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CPageWrite(unsigned char ucRDAddress,unsigned int uiSendData[])
{
unsigned int *p;
unsigned char ucHighData;
unsigned char ucLowData;
unsigned char i;
p = uiSendData;//送数组首地址到指针
//I2C 开始通信,写起始地址
I2CStart();
I2CSendByte(0xa0);
I2CReceiveACK();
I2CSendByte(ucRDAddress);
I2CReceiveACK();
//数据传输
for(i = 0;i < 8;i++)
{
ucLowData = *p;
ucHighData = (*p >> 8);
p++;
I2CSendByte(ucLowData);
I2CReceiveACK();
I2CSendByte(ucHighData);
I2CReceiveACK();
}
I2CStop();
I2CDelay(1000);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -