论坛风格切换切换到宽版
  • 2277阅读
  • 0回复

mb1504的c程序(转) [复制链接]

上一主题 下一主题
离线efree
 
发帖
554
只看楼主 倒序阅读 0楼 发表于: 2008-03-21
//注:本程序需添加头文件才能编译同过,仅供大家参考
//============================================
//   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
//============================================