📄 ds1629.c
字号:
/*==============================================================================
文件名: Ds1629.c
日期: 2008年2月9日
公司(作者):
描述和说明: 时钟芯片DS1629总线通信程序
===============================================================================*/
#include "F2407REGS_c.h"
#define H_SDA1 PFDATDIR = PFDATDIR | 0x0001; //IOPC0:H_SDA1;
/* 0000,0000,0000,0001 =0x0001
0~~~ ~~~~ ~~~~ ~~~~ [C7DIR] 0:input; 1:output
~0~~ ~~~~ ~~~~ ~~~~ [C6DIR] 0:input; 1:output
~~0~ ~~~~ ~~~~ ~~~~ [C5DIR] 0:input; 1:output
~~~0 ~~~~ ~~~~ ~~~~ [C4DIR] 0:input; 1:output
~~~~ 0~~~ ~~~~ ~~~~ [C3DIR] 0:input; 1:output
~~~~ ~0~~ ~~~~ ~~~~ [C2DIR] 0:input; 1:output
~~~~ ~~0~ ~~~~ ~~~~ [C1DIR] 0:input; 1:output
~~~~ ~~~0 ~~~~ ~~~~ [C0DIR] 0:input; 1:output
~~~~ ~~~~ 0~~~ ~~~~ [IOPC7] 0:low; 1:high
~~~~ ~~~~ ~0~~ ~~~~ [IOPC6] 0:low; 1:high
~~~~ ~~~~ ~~0~ ~~~~ [IOPC5] 0:low; 1:high
~~~~ ~~~~ ~~~0 ~~~~ [IOPC4] 0:low; 1:high
~~~~ ~~~~ ~~~~ 0~~~ [IOPC3] 0:low; 1:high
~~~~ ~~~~ ~~~~ ~0~~ [IOPC2] 0:low; 1:high
~~~~ ~~~~ ~~~~ ~~0~ [IOPC1] 0:low; 1:high
~~~~ ~~~~ ~~~~ ~~~1 [IOPC0] 0:low; 1:high
*/
#define L_SDA1 PFDATDIR = PFDATDIR & 0xFFFE; //L_SDA1;
#define H_SCL1 PFDATDIR = PFDATDIR | 0x0008; //IOPF3:H_SCL1;
/* 0000,0000,0000,1000 =0x0008
0~~~ ~~~~ ~~~~ ~~~~ [C7DIR] 0:input; 1:output
~0~~ ~~~~ ~~~~ ~~~~ [C6DIR] 0:input; 1:output
~~0~ ~~~~ ~~~~ ~~~~ [C5DIR] 0:input; 1:output
~~~0 ~~~~ ~~~~ ~~~~ [C4DIR] 0:input; 1:output
~~~~ 0~~~ ~~~~ ~~~~ [C3DIR] 0:input; 1:output
~~~~ ~0~~ ~~~~ ~~~~ [C2DIR] 0:input; 1:output
~~~~ ~~0~ ~~~~ ~~~~ [C1DIR] 0:input; 1:output
~~~~ ~~~0 ~~~~ ~~~~ [C0DIR] 0:input; 1:output
~~~~ ~~~~ 0~~~ ~~~~ [IOPC7] 0:low; 1:high
~~~~ ~~~~ ~0~~ ~~~~ [IOPC6] 0:low; 1:high
~~~~ ~~~~ ~~0~ ~~~~ [IOPC5] 0:low; 1:high
~~~~ ~~~~ ~~~0 ~~~~ [IOPC4] 0:low; 1:high
~~~~ ~~~~ ~~~~ 1~~~ [IOPC3] 0:low; 1:high
~~~~ ~~~~ ~~~~ ~0~~ [IOPC2] 0:low; 1:high
~~~~ ~~~~ ~~~~ ~~0~ [IOPC1] 0:low; 1:high
~~~~ ~~~~ ~~~~ ~~~0 [IOPC0] 0:low; 1:high
*/
#define L_SCL1 PFDATDIR = PFDATDIR & 0xFFF7; //IOPC3:L_SCL1;
#define Nop1() asm(" Nop");asm(" Nop"); asm(" Nop");
//asm(" Nop");asm(" Nop");
unsigned int ack_Ds1629;
extern tem_h,tem_l;
/*
Nop1()
{
asm(" Nop");
asm(" Nop");
asm(" Nop");
asm(" Nop");
asm(" Nop");
}
*/
Delay_Ds1629()
{
unsigned int i;
for(i=0;i<15000;i++);
}
/******************************************************************************
函数名称:void InitIOPort_ds1629
函数功能:初始化IIC总线I/O口,针对ds1629,
IOPC0、IOPC1、IOPC2、IOPC3、IOPC4、IOPC5设为IO口
入口参数:无
出口参数:无
******************************************************************************/
void InitIOPort_Ds1629()
{
MCRC = MCRC & 0xF6FF; //将IOPF0,IOPF3配置为普通I/O
/* 1111,0110,1111,1111 =0xF6FF
1:primary function 0:I/O function
1~~~ ~~~~ ~~~~ ~~~~ [MCRB.15]1:TMS2; 0:Reserved
~1~~ ~~~~ ~~~~ ~~~~ [MCRB.14]1:TMS; 0:Reserved
~~1~ ~~~~ ~~~~ ~~~~ [MCRB.13]1:TDO; 0:Reserved
~~~1 ~~~~ ~~~~ ~~~~ [MCRB.12]1:TDI; 0:Reserved
~~~~ 0~~~ ~~~~ ~~~~ [MCRB.11]1:TCK; 0:Reserved
~~~~ ~1~~ ~~~~ ~~~~ [MCRB.10]1:EMU1; 0:Reserved
~~~~ ~~1~ ~~~~ ~~~~ [MCRB.9] 1:EMU0; 0:Reserved
~~~~ ~~~0 ~~~~ ~~~~ [MCRB.8] 1:XINT2/ADCSOC; 0:IOPD0
~~~~ ~~~~ 1~~~ ~~~~ [MCRB.7] 1:CANRX; 0:IOPC7
~~~~ ~~~~ ~1~~ ~~~~ [MCRB.6] 1:CANTX; 0:IOPC6
~~~~ ~~~~ ~~1~ ~~~~ [MCRB.5] 1:SPISTE; 0:IOPC5
~~~~ ~~~~ ~~~1 ~~~~ [MCRB.4] 1:SPICLK; 0:IOPC4
~~~~ ~~~~ ~~~~ 1~~~ [MCRB.3] 1:SPISOMI; 0:IOPC3
~~~~ ~~~~ ~~~~ ~1~~ [MCRB.2] 1:SPISIMO; 0:IOPC2
~~~~ ~~~~ ~~~~ ~~1~ [MCRB.1] 1:BIO; 0:IOPC1
~~~~ ~~~~ ~~~~ ~~~1 [MCRB.0] 1:W/R; 0:IOPC0
*/
PFDATDIR = PFDATDIR | 0x0800; // IOPF3为输出
/* 0011,1110,0011,0110 =0x3E36
0~~~ ~~~~ ~~~~ ~~~~ [C7DIR] 0:input; 1:output
~0~~ ~~~~ ~~~~ ~~~~ [C6DIR] 0:input; 1:output
~~0~ ~~~~ ~~~~ ~~~~ [C5DIR] 0:input; 1:output
~~~0 ~~~~ ~~~~ ~~~~ [C4DIR] 0:input; 1:output
~~~~ 1~~~ ~~~~ ~~~~ [C3DIR] 0:input; 1:output
~~~~ ~0~~ ~~~~ ~~~~ [C2DIR] 0:input; 1:output
~~~~ ~~0~ ~~~~ ~~~~ [C1DIR] 0:input; 1:output
~~~~ ~~~0 ~~~~ ~~~~ [C0DIR] 0:input; 1:output
~~~~ ~~~~ 0~~~ ~~~~ [IOPC7] 0:low; 1:high
~~~~ ~~~~ ~0~~ ~~~~ [IOPC6] 0:low; 1:high
~~~~ ~~~~ ~~0~ ~~~~ [IOPC5] 0:low; 1:high
~~~~ ~~~~ ~~~0 ~~~~ [IOPC4] 0:low; 1:high
~~~~ ~~~~ ~~~~ 0~~~ [IOPC3] 0:low; 1:high
~~~~ ~~~~ ~~~~ ~0~~ [IOPC2] 0:low; 1:high
~~~~ ~~~~ ~~~~ ~~0~ [IOPC1] 0:low; 1:high
~~~~ ~~~~ ~~~~ ~~~0 [IOPC0] 0:low; 1:high
*/
}
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c_Ds1629()
{
PFDATDIR = PFDATDIR | 0x0100; // IOPC0为输出,SDA?
Nop1();
H_SDA1; /*发送起始条件的数据信号*/
Nop1();
H_SCL1;
Nop1(); /*起始条件建立时间大于4.7us,延时*/
Nop1();
Nop1();
Nop1();
Nop1();
L_SDA1; /*发送起始信号*/
Nop1(); /* 起始条件锁定时间大于4μs*/
Nop1();
Nop1();
Nop1();
Nop1();
L_SCL1; /*钳住I2C总线,准备发送或接收数据 */
Nop1();
Nop1();
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c_Ds1629()
{
PFDATDIR = PFDATDIR | 0x0100; //IOPF5为输出,SDA?
Nop1();
L_SDA1; /*发送结束条件的数据信号*/
Nop1(); /*发送结束条件的时钟信号*/
H_SCL1; /*结束条件建立时间大于4μs*/
Nop1();
Nop1();
Nop1();
Nop1();
Nop1();
H_SDA1; /*发送I2C总线结束信号*/
Nop1();
Nop1();
Nop1();
Nop1();
}
/*******************************************************************
字节数据传送函数
函数原型: void Write_Byte(unsigned int c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack_ds1629=; ack_ds1629=0表示被控器无应答或损坏。
********************************************************************/
void Write_Ds1629_Byte(unsigned int c)
{
unsigned int BitCnt;
unsigned int DataToCompare;
PFDATDIR = PFDATDIR | 0x0100; //IOPF5为输出,SDA
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
// if((c<<BitCnt)&0x80) { H_SDA1; } /*判断发送位*/
DataToCompare=c&0x0080;
if(DataToCompare) /*判断发送位*/
{
H_SDA1;
}
else
{
L_SDA1;
}
Nop1();
H_SCL1; /*置时钟线为高,通知被控器开始接收数据位*/
Nop1();
Nop1(); /*保证时钟高电平周期大于4μs*/
Nop1();
Nop1();
Nop1();
L_SCL1;
c=c<<1;
}
Nop1();
Nop1();
H_SDA1; /*8位发送完后释放数据线,准备接收应答位*/
Nop1();
Nop1();
PFDATDIR = PFDATDIR & 0xFEFF; //IOPC0为输入,SDA,
H_SCL1;
Nop1();
Nop1();
Nop1();
DataToCompare=PFDATDIR & 0x0001;
if(DataToCompare)
{
ack_Ds1629=0;
}
else
{
ack_Ds1629=1; /*判断是否接收到应答信号*/
}
L_SCL1;
Nop1();
Nop1();
}
/*******************************************************************
字节数据传送函数
函数原型: unsigned int Read_Byte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
********************************************************************/
unsigned int Read_Ds1629_Byte()
{
unsigned int retc;
unsigned int BitCnt;
PFDATDIR = PFDATDIR & 0xFEFF; //IOPC0为输入,SDA,
retc=0;
H_SDA1; /*置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
Nop1();
L_SCL1; /*置时钟线为低,准备接收数据位*/
Nop1();
Nop1(); /*时钟低电平周期大于4.7μs*/
Nop1();
Nop1();
Nop1();
H_SCL1; /*置时钟线为高使数据线上数据有效*/
Nop1();
Nop1();
retc=retc<<1;
if(PFDATDIR & 0x0001)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
Nop1();
Nop1();
}
L_SCL1;
Nop1();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -