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

📄 mcu.c

📁 在8051F023上测试通过的CS5460驱动函数
💻 C
字号:
/************************************************************************************** 
* COPYRIGHT                                              * 
*                                                   * 
*-------------------------------------------------------------------------------------* 
* 程序名:mcu.c	                                                                  *   
* 目的:基于C8051F023的CS5460驱动函数                                                				  * 
* 作者: 马三元 Sam                                                               * 
* Email: dragonmsy@163.com                                                            * 
* 版本:1.0                                                                           * 
* 日期:2008-05                                                                       * 
                                                            
//于C8051F023下调试通过,用的是SILICON安装目录下EXAMPLE下的头文件
                                                                                      *                                                                   
**************************************************************************************/  


//-----------------------------------------------------------------------------
// Includes and Device-Specific Parameters
//-----------------------------------------------------------------------------

#include <compiler_defs.h>
#include <C8051F020_defs.h>


//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------

#define SYSCLK               16000000            //  SYSCLK frequency in Hz  internal clock


// CS5460
sbit CS5460_CLK = P0^2;
sbit SDO = P0^3;					   
sbit SDI = P0^4;
sbit CS5460_CS = P0^5;
sbit CS5460_RESET = P2^6;
sbit CS5460_INT = P3^7;


//CS5460全局定义
U8 xdata rev_data[3]={0}; //存放读取的3个字节数据,高字节在前
U8 xdata send_data[3]={0}; //存放写入的3个字节数据,高字节在前

//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------

void SYSCLK_Init (void);
void PORT_Init (void);


void CS5460_init(void);
void CS5460_WriteCommand(U8 CS5460_command);
void CS5460_ReadReg(U8 CS5460_reg);
void CS5460_WriteReg(U8 CS5460_reg);


//delay FUNCTION
void delay_us(U8  n);
void delay_ms(U8  n);


//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------


void main()
{

    U8 i,j;                    				// Temporary counter variable
		U8 one,two,three;

    WDTCN = 0xde;                     // Disable watchdog timer
    WDTCN = 0xad;

		delay_ms(10);

    SYSCLK_Init();                 		// Initialize oscillator
    PORT_Init();                      // Initialize crossbar and GPIO
  	delay_us(100);                                                          
		CS5460_init();
    delay_ms(10);

		for(i=0;i<3;i++)
		{	
			rev_data[i]=0;
			send_data[i]=0;
		}

//测试CS5460读写驱动函数

		send_data[0] = 9;
		send_data[1] = 10;
		send_data[2] = 8;
		CS5460_WriteReg(0x4a);	//写入循环计数寄存器

		CS5460_ReadReg(0x0a);	  //读取刚才写入的循环计数寄存器
//	CS5460_ReadReg(0x1e);   //读取状态寄存器
//	CS5460_ReadReg(0x02);		//读取配置寄存器
		
		one = rev_data[0];	  //高字节
 		two = rev_data[1];		
  	three = rev_data[2];  //低字节		
		
   
   while(1)
   {

   }
 


}


//-----------------------------------------------------------------------------
// SYSCLK_Init ()
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// This routine initializes the system clock to use the internal 16 MHz
// oscillator as its clock source.  Also enables missing clock detector reset.
//
//-----------------------------------------------------------------------------

void SYSCLK_Init (void)
{
   OSCICN |= 0x03;                     // Configure internal oscillator for
                                       // its highest frequency (16 MHz)

									   									 // at 16 MHz, 1 ms = 16000 SYSCLKs
                                       // DJNZ = 2 SYSCLKs

   OSCICN |= 0x80;                     // Enable missing clock detector reset
}


void PORT_Init (void)
{


   XBR0 = 0x01;                        // Enable SMBus on the crossbar

   XBR2 = 0x40;                        // Enable crossbar and weak pull-ups

   P0MDOUT = 0x00;

}



//-----------------------------------------------------------------------------
// CS5460驱动程序
//-----------------------------------------------------------------------------

void CS5460_init(void)
{

	CS5460_CS = 0;
	CS5460_RESET = 0;
	delay_ms(10);
	CS5460_RESET = 1;

	CS5460_WriteCommand(0xff);
	CS5460_WriteCommand(0xff);
	CS5460_WriteCommand(0xff);
	CS5460_WriteCommand(0xfe);

}




//******************************************
//函数:CS5460_WriteCommand(U8 5460_command)
//功能:写cs5460命令字
//参数:CS5460_command:有7种命令字
//返回值:无
//******************************************

void CS5460_WriteCommand(U8 CS5460_command)
{
	U8 data i;

	
    for(i=0;i<8;i++)
  	{

		SDI=(bit)(CS5460_command&0x80);  //最高位送入SDI
		CS5460_CLK=0;
		delay_us(1); 	  	 
   		CS5460_CLK=1;    //拉高时钟线
		delay_us(1);
   		CS5460_command=CS5460_command<<1;  //左移位
		
	}  

}



//******************************************
//函数:CS5460_ReadReg(U8 5460_reg)
//功能:从CS5460的某寄存器中读取一个字节
//参数:CS5460_reg:CS5460的内部寄存器,参考<<电能计量CS5460中文资料>>文档
//******************************************

void CS5460_ReadReg(U8 CS5460_reg)
{
	U8 data i,j;
	U8 temp;
	bit c_temp;
	

	CS5460_WriteCommand(CS5460_reg);    //写命令字选取寄存器

	for(i=0;i<3;i++)
	{	
		temp = 0xfe;
		for(j=0;j<8;j++)
		{
			CS5460_CLK=0;
			delay_us(1);
		
			c_temp = SDO;
			rev_data[i] = rev_data[i]|c_temp;

			SDI=(bit)(temp&0x80);
			if(j!=7)    //最低位停止左移
			{
				rev_data[i] = rev_data[i]<<1;
				temp = temp<<1;
			}
			CS5460_CLK=1;
			delay_us(1);

				
		}
	}

}


//******************************************
//函数:CS5460_WriteReg(U8 5460_reg)
//功能:向CS5460的某寄存器中写入一个字节
//参数:5460_reg:CS5460的内部寄存器,参考<<电能计量CS5460中文资料>>文档
//******************************************

void CS5460_WriteReg(U8 CS5460_reg)     //先写高字节
{
	U8 data i,j;

	CS5460_WriteCommand(CS5460_reg);    //写命令字选取寄存器

	for(i=0;i<3;i++)
	{
		
		for(j=0;j<8;j++)
		{
			SDI=(bit)(send_data[i]&0x80);  //最高位送入SDI
   			CS5460_CLK=0;    //拉低时钟线
 			delay_us(1);      
   			CS5460_CLK=1;    //拉高时钟线
			delay_us(1);
			if(j!=7)
				send_data[i] = send_data[i]<<1;
		}
	}	

}


//----------------------------------------------------------------------
// CS5460 Support Functions End
//----------------------------------------------------------------------


//******************************************
//函数:delay_ms(u8 n)
//功能:延时函数
//参数:延时时间n (ms)
//******************************************

void delay_ms(U8  n)
{
	unsigned int i;
	U8 m;
   	
	for (m = 0; m < n; m++)
		// Wait at least 1 ms.
   		for (i = 9000; i > 0; i--);         // at 16 MHz, 1 ms = 16000 SYSCLKs
                                        	// DJNZ = 2 SYSCLKs
}



//******************************************
//函数:delay_us(u8 n)
//功能:延时函数
//参数:延时时间n (us)
//******************************************

void delay_us(U8  n)
{
	U8 i,m;
   	
	for (m = 0; m < n; m++)
		// Wait at least 1 us.
   		for (i = 9; i > 0; i--);         // at 16 MHz, 1 ms = 16000 SYSCLKs
                                        	// DJNZ = 2 SYSCLKs
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -