📄 msp430i2c.c
字号:
//参考《msp430系列单片机实用c语言程序设计》张唏王德银张晨编,人民邮电出版社
/*************************************************************
IIC模块iic.c,包括iic初始化,Start,Stop,Ak, NoAck,
TestAck,Write8Bit,Read8Bit, delay 9个函数。
*************************************************************/
#include <msp430x16x.h>
#include "MSP430I2C.h"
/*初始化iic*/
void DelayMs(unsigned char time)
{
unsigned int i = 0;
while( time --)
{
i = 500;
while(i--);
}
}
/*延时,可由时钟频率自行调整*/
void delay()
{
unsigned char q0;
for(q0=0;q0<20;q0++)
{
_NOP();
}
}
/*启动总线*/
void Start()
{
SDA_OUT;
S_SDA;
delay();
S_SCL;
delay();
C_SDA;
delay();
C_SCL;
delay();
}
/*停止总线*/
void Stop()
{
SDA_OUT;
C_SCL;
delay();
C_SDA;
delay();
S_SCL;
delay();
S_SDA;
DelayMs(10);
}
/*初始化iic*/
void InitIIC()
{
IIC_DIR|=IIC_SCL;
IIC_DIR&=~IIC_SDA;
C_SCL;
Stop();
}
/*iic总线应答*/
void Ak()
{
SDA_OUT;
C_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
S_SDA;
}
/*iic总线无应答*/
void NoAck()
{
SDA_OUT;
S_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
}
/*iic总线检验应答
返回值:iic应答位的值。0:应答,1:无应答*/
unsigned char TestAck()
{
unsigned char ack;
S_SCL;
delay();
SDA_IN;
delay();
ack=READ_SDA;
delay();
C_SCL;
delay();
return(ack);
}
/*总线写8位数据.input:要写的8位数*/
void Write8Bit(unsigned char input)
{
unsigned char temp,q0;
SDA_OUT;
for(temp=8;temp!=0;temp--)
{
q0=input&0x80;
if(q0==0x80)
S_SDA;
else
C_SDA;
delay();
S_SCL;
delay();
C_SCL;
input=input<<1;
}
C_SDA;
}
/*总线读8位数据.返回值:读出的8位数*/
unsigned char Read8Bit()
{
unsigned char temp,q0,rbyte=0;
SDA_IN;
for(temp = 8; temp != 0; temp--)
{
S_SCL;
delay();
rbyte = rbyte<<1;
SDA_IN;
q0 = READ_SDA;
if(q0 == IIC_SDA)
rbyte = rbyte|0x01;
delay();
C_SCL;
delay();
}
return(rbyte);
}
// 子程序: I2CReadRTC(
unsigned char I2CReadStr(unsigned char DeviceAddr, unsigned char DataAddr, unsigned char *data,unsigned char len)
{
Start();
Write8Bit(DeviceAddr);
delay();
if(TestAck()==1)
return 0;
Write8Bit(DataAddr); //初始化指针,指向要读的地址.
delay();
if(TestAck()==1)
return 0;
Stop();
delay();
Start();
Write8Bit(DeviceAddr | 1); //rtc转从发送模式
delay();
if(TestAck() == 1)
return 0;
while(len != 1)
{
*data=Read8Bit();
Ak();
data++;
len--;
}
*data=Read8Bit(); //读入最后一个字节
NoAck();
Stop();
return 1;
}
unsigned char I2CWriteStr(unsigned char DeviceAddr, unsigned char DataAddr, unsigned char *data,unsigned char len)
{
Start();
Write8Bit(DeviceAddr);
delay();
if(TestAck()==1)
return 0;
Write8Bit(DataAddr);
delay();
if(TestAck()==1)
return 0;
for(;len > 0;len--)
{
Write8Bit(*data);
delay();
if(TestAck()==1)
return 0;
data++;
}
Stop();
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -