//注:本程序需添加头文件才能编译同过,仅供大家参考
//============================================
// copyright (c), 2006, hust.
// ----filename: mb1504.c
// -description: mb1504芯片的驱动程序
// -----history: 06/9/2 v1.0 created by l.f.
// 06/9/4 v2.0 modified by l.f.
//============================================
#include "spce061a.h"
//定义mb1504与spce061a的接口
#define m_le 0x0001 //使能端
#define m_data 0x0002 //串行数据
#define m_clk 0x0004 //时钟
//一般宏定义
#define set_ioa_bit(x) (*p_ioa_data = *p_ioa_buffer | x) //置高
#define clear_ioa_bit(x) (*p_ioa_data = *p_ioa_buffer & ~x) //置低
//============================================
// ----function: void init_mb1504(void)
// -description: 初始化与mb1504相连接的io口,并向mb1504写入参考频率分频比数据
// --parameters: 无
// ------return: 无
// -------notes: 这里设定的参考频率为2khz ,外部晶振选择12mhz
//============================================
void init_mb1504(void)
{
//初始化所需io口为低电平输出
*p_ioa_dir |= (m_data + m_le + m_clk);
*p_ioa_attrib |= (m_data + m_le + m_clk);
*p_ioa_data &= ~(m_data + m_le + m_clk);
}
//============================================
// ----function: void write_mb1504(void)
// -description: 向mb1504写入可编程分频比以及吞吐计数器数据
// --parameters: uifreq_out 设置锁定频率
// ------return: 无
// -------notes: 无
//============================================
void write_mb1504(float ffreq_out)
{
unsigned int i;
unsigned int uimask = 0x2000;
unsigned int uitotal_counter; //程序分频器总分频比
unsigned int uiswal_counter;
unsigned int uiprgm_counter;
unsigned int uiref_counter = 12000; //参考频率选择1khz
clear_ioa_bit(m_le);//m_le置低
//送一位sm信号
clear_ioa_bit(m_clk);
clear_ioa_bit(m_data);//sw=0 (选择64/65分频模式)
set_ioa_bit(m_clk);
//送14位的参考分频计数器数据
for(i = 0;i < 14;i++)
{
clear_ioa_bit(m_clk);
if(uiref_counter & uimask)
{
set_ioa_bit(m_data); //uiref_counter第i位为1就往m_data连接的io口送1
}
else
{
clear_ioa_bit(m_data);//否则送0
}
set_ioa_bit(m_clk);
uimask = uimask >> 1;
}
//送一位的控制位
clear_ioa_bit(m_clk);
set_ioa_bit(m_data); //c=1;
set_ioa_bit(m_clk);
set_ioa_bit(m_le); //上升沿输出使能
uimask = 0x0400;
//根据所要频率计算相关数据
uitotal_counter = (unsigned int)((ffreq_out )* 1000);
uiprgm_counter = uitotal_counter >> 6;
uiswal_counter = uitotal_counter - (uiprgm_counter << 6);
//送11位可编程分频比计数器数据和7位吞吐计数器数据
clear_ioa_bit(m_le);//m_le置低
for(i = 0;i < 11;i++)
{
clear_ioa_bit(m_clk);
if(uiprgm_counter & uimask)
{
set_ioa_bit(m_data); //uiprgm_counter第i位为1就往m_data连接的io口送1
}
else
{
clear_ioa_bit(m_data);//否则送0
}
set_ioa_bit(m_clk);
uimask = uimask >> 1;
}
uimask = 0x0040;
for(i = 0;i < 7;i++)
{
clear_ioa_bit(m_clk);
if(uiswal_counter & uimask)
{
set_ioa_bit(m_data); //uiswal_counter第i位为1就往m_data连接的io口送1
}
else
{
clear_ioa_bit(m_data);//否则送0
}
set_ioa_bit(m_clk);
uimask = uimask >> 1;
}
//送1位的控制位
clear_ioa_bit(m_clk);
clear_ioa_bit(m_data); //c=0;
set_ioa_bit(m_clk);
set_ioa_bit(m_le); //上升沿输出使能
}
//============================================
// end of mb1504.c
//============================================