📄 mcu.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 + -