📄 iic_pcf8563.c
字号:
/********************************************************************
文件名:i2c.c/i2c.h
名称:MSP430 模拟IIC总线程序
********************************************************************/
//#ifndef _I2C_H
//#define _I2C_H
//#include "msp430x14x.h"
#include "msp430x16x.h"
#define SDA_1 P3OUT|=BIT1 //SDA = 1
#define SDA_0 P3OUT&=~BIT1 //SDA = 0
#define SCL_1 P3OUT|=BIT3 //SCL = 1
#define SCL_0 P3OUT&=~BIT3 //SCL = 0
#define SDA_IN P3DIR&=~BIT1 //I/O口为输入
#define SDA_OUT P3DIR|=BIT1 //I/0口为输出
#define J_SDA_1_or_0 (P3IN & BIT1)==BIT1
//------------------------------------------
//Delay_PCF8563 函数程序//功能:延时子程序
//==========================================
static void Delay_PCF8563(unsigned int n)
{
while(n!=0)
{n--;}
}
//=========================================
//START 函数程序
//功能:开始闪存操作
//=========================================
void Start(void)
{
SDA_OUT;
SDA_1;
Delay_PCF8563(6);
SCL_1;
Delay_PCF8563(6);
SDA_0;
Delay_PCF8563(6);
SCL_0;
Delay_PCF8563(6);
}
//=========================================
//STOP 函数程序
//功能:停止闪存操作
//==========================================
void Stop(void)
{
SDA_OUT;
SDA_0;
Delay_PCF8563(6);
SCL_1;
Delay_PCF8563(6);
SDA_1;
Delay_PCF8563(6);
}
void TX_Byte(unsigned char WriteData)
{
unsigned char i,j;
j=WriteData;
SDA_OUT;
for (i=0; i<8; i++)
{
if ((j&0x80)==0)
{ SDA_0;}
else
{ SDA_1;}
j <<=1;
Delay_PCF8563(6);
SCL_1;
Delay_PCF8563(6);
SCL_0;
Delay_PCF8563(6);
}
}
unsigned char RX_Byte(void)
{
unsigned char i;
unsigned char TempData = 0;
SDA_IN;
for (i=0; i<8; i++)
{
Delay_PCF8563(6);
SCL_1;
Delay_PCF8563(6);
TempData <<= 1;
if (J_SDA_1_or_0)
{ TempData++; }
SCL_0;
Delay_PCF8563(6);
}
SDA_OUT;
return(TempData);
}
//=========================================
//ACK 函数程序
//功能:挂高电平表示闪存时钟信号
//==========================================
void ReceiveAck(void)
{
SDA_IN;
SCL_1;
Delay_PCF8563(10);
while (J_SDA_1_or_0);
SCL_0;
SDA_OUT;
Delay_PCF8563(10);
}
void SendAck(unsigned char ack)
{
SDA_OUT;
if(ack) SDA_1;
else SDA_0;
Delay_PCF8563(6);
SCL_1;
Delay_PCF8563(6);
SCL_0;
Delay_PCF8563(6);
return;
}
/*
unsigned char ReadWord(unsigned long int unit)//uint=address
{
unsigned char LowAdd = 0;
unsigned char HighAdd = 0;
unsigned char TempData = 0;
LowAdd = (unsigned char)unit;
HighAdd = (unsigned char)(unit >> 8);
SDA_OUT;
Start();
TX_Byte(0xa0);
ReceiveAck();
TX_Byte(HighAdd);
ReceiveAck();
TX_Byte(LowAdd);
ReceiveAck();
Start();
TX_Byte(0xa1);
ReceiveAck();
TempData = RX_Byte();
Stop();
Delay_PCF8563(8000);
return(TempData);
}
void WriteWord(unsigned long int uint, unsigned char WriteData)//uint=address
{
unsigned char LowAdd = 0;
unsigned char HighAdd = 0;
LowAdd = (unsigned char)unit;
HighAdd = (unsigned char)(unit >> 8);
Start();
TX_Byte(0xa0);
ReceiveAck();
TX_Byte(HighAdd);
ReceiveAck();
TX_Byte(LowAdd);
ReceiveAck();
TX_Byte(WriteData);
ReceiveAck();
Stop();
Delay_PCF8563(8000);
}
*/
void SendStr(unsigned char sladdr, unsigned char subaddr, unsigned char *s, unsigned char len)
{
unsigned char i;
Start(); // 开始总线
TX_Byte(sladdr); // 发送地址
ReceiveAck();
TX_Byte(subaddr); // 发送子地址
ReceiveAck();
for(i=0; i<len; i++)
{
TX_Byte(*s); // 发送数据
ReceiveAck();
s++;
}
// s--;
Stop(); // 结束总线
return;
}
void RecvStr(unsigned char sladdr, unsigned char subaddr ,unsigned char *s, unsigned char len)
{
unsigned char i;
Start(); // 申请总线
TX_Byte(sladdr); // 发送地址
ReceiveAck();
TX_Byte(subaddr); // 发送从机子地址
ReceiveAck();
Start(); // 申请总线
TX_Byte(sladdr+1);
ReceiveAck();
for(i=0; i<len-1; i++)
{
*s =RX_Byte(); // 取出数据
SendAck(0);
s++;
}
//s--;
*s=RX_Byte();
SendAck(1); // 接收最后一字节数据并发送uack
Stop();
return;
}
//#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -