本帖最后由 q891031520 于 2018-8-2 18:42 编辑
最近试着用PCF8563T这个芯片,用IIC通信,不过在尝试了几次后没有写进去数据,也没有读出来。但是一样的逻辑51就可以读写。
又找了网上某兄弟的代码。改了下还是不行,贴出程序来大家帮忙看看,没怎么用过IIC。
/* PCF8563 底层驱动程序
2006-04-18 */
#include <msp430x14x.h>
//#include "msp430_m.h"
#include "BaseConfig.h"
#define ADDR_RD 0xa3
#define ADDR_WR 0xa2
#define REG_CTL1 0x00
#define REG_CTL2 0x01
#define REG_SEC 0x02
#define REG_MIN 0x03
#define REG_HOUR 0x04
#define REG_DAY 0x05
#define REG_WEEK 0x06
#define REG_MON 0x07
#define REG_YEAR 0x08
#define REG_ALARM_MIN 0x09
#define REG_ALARM_HOUR 0x0a
#define REG_ALARM_DAY 0x0b
#define REG_ALARM_WEEK 0x0c
#define REG_FREQ 0x0d
#define REG_TMRCTL 0x0e
#define REG_TMR 0x0f
#define uchar unsigned char
#define uint unsigned int
//******************************************************
#define set_sda() Set_Bit(P3OUT,BIT2)//bitclr(P4DIR,BIT0); //设置为输入模式,因为有上拉电阻,故输出高电平
#define clr_sda() Clr_Bit(P3OUT,BIT2) //bitset(P4DIR,BIT0) //设置为输出模式,端口POUT初始化时必须设定为0
#define sdain() Clr_Bit(P3DIR,BIT2)
#define sdaout() Set_Bit(P3DIR,BIT2)
#define set_sclk() Set_Bit(P3OUT,BIT3)//bitset(P4OUT,BIT3)
#define clr_sclk() Clr_Bit(P3OUT,BIT3)//bitclr(P4OUT,BIT3)
#define sclkout() Set_Bit(P3OUT,BIT3)
#define bittest_sda_1() (P3IN&BIT2)==BIT2//bittest(P4IN,BIT0) //测试SDA的输入信号是否为1
//*****************************************************************
uchar time_init_data[7]={0,0,12,5,5,9,14};
uchar time_data[7]={0,0,0,0,0,0,0};
uint sec;
void test_pcf8563(void);
void InitOSC(void)
{
unsigned char i;
BCSCTL1 &= ~XT2OFF; //打开XT振荡器
BCSCTL2 |= SELM_2+ SELS + DIVS_3;
do
{
IFG1 &= ~OFIFG; //清除振荡错误标志
for(i = 0; i < 100; i++)
_NOP(); //延时等待
}
while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
}
static void Start(void) //ok,启动IIC总线
{
sdaout();
sclkout();
set_sda(); //1
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
set_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
clr_sda();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
clr_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
static void Stop(void)
{
clr_sda();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
set_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
set_sda();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
clr_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
static void Ack(void)
{
clr_sda();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
set_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
clr_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
static void NoAck(void)
{
set_sda();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
set_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
clr_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
static void Write8Bit(unsigned char input)
{
unsigned char i;
for(i=0;i<8;i--)
{
if(input&0x80)
{
set_sda();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
set_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
clr_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
else
{
clr_sda();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
set_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
clr_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
input<<=1;
}
}
/***********************************/
static unsigned char Read8Bit(void)
{
unsigned char i,rbyte;
rbyte=0;
for(i=0;i<8;i++)
{
sdain();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
set_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
rbyte<<=1;
if(bittest_sda_1())
rbyte|=0x01;
clr_sclk();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
return(rbyte);
}
/*************************************/
void pcf8563_wr(uchar addr,uchar *ptr_data1,uchar length)
{
Start();
Write8Bit(ADDR_WR);
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
Write8Bit(addr);
_NOP();
_NOP();
_NOP();
for(;length;--length)
{
Write8Bit(*ptr_data1++);
_NOP();_NOP();_NOP();_NOP();_NOP();
}
Stop();
}
/*************************************/
void pcf8563_rd(uchar addr,uchar *ptr_data1,uchar length)
{
Start();
Write8Bit(ADDR_WR);
Write8Bit(addr);
Start();
Write8Bit(ADDR_RD);
for(;length;length--)
{
Ack();
*ptr_data1++=Read8Bit();
}
NoAck();
Stop();
}
void rtc_init()
{
Start();
Write8Bit(ADDR_WR);
Write8Bit(0x00);
Write8Bit(0x00);
Stop();
}
void main (void)
{
WDTCTL = WDTPW + WDTHOLD;
rtc_init();
while(1)
pcf8563_rd(0x02,time_data,7);
}
/*******************************/
#if 0
uint sec;
void test_pcf8563(void)
{
uchar i,arr[16];
uchar const arr_init_rtc[]=
{
0x00,
0x00,
0x00,
0x00,
0x08,
0x01,
0x01,
0x05,
0x04,
0x80,
0x80,
0x80,
0x80,
0x83,
0x00
};
for(i=0;i<sizeof(arr_init_rtc);++i)
arr=arr_init_rtc;
pcf8563_wr(0,arr,sizeof(arr_init_rtc));
for(;;)
{
for(i=0;i<20;++i)
arr=0;
pcf8563_rd(0,arr,8);
sec=(arr[2]>>4)*10;
sec+=arr[2]&0x0f;
i=sec;
_NOP();
}
}
#endif
/******************************************/
此帖出自小平头技术问答
这是源文件
一周热门 更多>