⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1629.c

📁 此程序是DSP 2407与时钟芯片DS1629之间的通信
💻 C
📖 第 1 页 / 共 2 页
字号:

/*==============================================================================
文件名:		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 + -