SI5338AI2C配置程序.docx
- 文档编号:23383915
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:18
- 大小:16.24KB
SI5338AI2C配置程序.docx
《SI5338AI2C配置程序.docx》由会员分享,可在线阅读,更多相关《SI5338AI2C配置程序.docx(18页珍藏版)》请在冰豆网上搜索。
SI5338AI2C配置程序
#include
#include
#include
#include"ADDR.H"
#include"SI5338.H"//clockbuilder产生寄存器值头文件
#defineucharunsignedchar
#defineuintunsignedint
#defineTRUE1
#defineFALSE0
sbitSCL=P2^6;
sbitSDA=P2^1;
bitI2CErr=FALSE;
bitLOCK_PLL=TRUE;
/*--------------------------------------------------------------------
函数名称:
延时
--------------------------------------------------------------------*/
voidDELAY(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*--------------------------------------------------------------------
函数名称:
10us延时
--------------------------------------------------------------------*/
voidDELAY_10(ucharn)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
while(--n);
}
/*--------------------------------------------------------------------
函数名称:
启动
--------------------------------------------------------------------*/
voidI2C_Start(void)
{
SDA=1;
SCL=1;
DELAY();
SDA=0;
DELAY();
SCL=0;
}
/*--------------------------------------------------------------------
函数名称:
停止
--------------------------------------------------------------------*/
voidI2C_Stop(void)
{
SCL=0;
SDA=0;
DELAY();
SCL=1;
DELAY();
SDA=1;
}
/*--------------------------------------------------------------------
函数名称:
测试应答
--------------------------------------------------------------------*/
bitI2C_WaitAck(void)
{
uchartimes=255;//避免故障,设定错误次数
SDA=1;
_nop_();
SCL=1;
while(SDA)
{
times--;
if(!
times)//超时值为255
{
I2C_Stop();
I2CErr=TRUE;
returnFALSE;
}
}
DELAY();
SCL=0;
I2CErr=FALSE;
returnTRUE;
}
/*--------------------------------------------------------------------
函数名称:
发送应答
--------------------------------------------------------------------*/
voidI2C_SendAck(void)
{
SDA=0;
DELAY();
SCL=1;
DELAY();
SCL=0;
}
/*--------------------------------------------------------------------
函数名称:
发送非应答
--------------------------------------------------------------------*/
voidI2C_SendNoAck(void)
{
SDA=1;
DELAY();
SCL=1;
DELAY();
SCL=0;
}
/*--------------------------------------------------------------------
函数名称:
发送1字节数据
--------------------------------------------------------------------*/
voidI2C_SendByte(uchardat)
{
uchari;
for(i=0;i<=7;i++)
{
_nop_();
if((dat&0x80)==0x80)
SDA=1;
else
SDA=0;
dat<<=1;
SCL=1;
DELAY();
SCL=0;
}
}
/*--------------------------------------------------------------------
函数名称:
接收1字节数据
--------------------------------------------------------------------*/
voidI2C_RcvByte(uchar*pRdDat)
{
uchari;
SDA=1;
for(i=0;i<=7;i++)
{
SCL=1;
DELAY();
*pRdDat<<=1;
*pRdDat|=SDA;
SCL=0;
DELAY();
}
}
/*--------------------------------------------------------------------
函数名称:
写N字节数据
--------------------------------------------------------------------*/
voidI2C_WrBytes(ucharwrDAdr1,ucharwordAdr1,uchar*pWrDat,ucharnum1)
{
uchari;
I2C_Start();
I2C_SendByte(wrDAdr1);
I2C_WaitAck();
I2C_SendByte(wordAdr1);
I2C_WaitAck();
for(i=0;i {I2C_SendByte(*(pWrDat+i)); I2C_WaitAck(); } I2C_Stop(); } /*-------------------------------------------------------------------- 函数名称: 读N字节数据 --------------------------------------------------------------------*/ voidI2C_RcvBytes(ucharwrDAdr2,ucharwordAdr2,ucharrdDAdr2,uchar*pRdDat,ucharnum2) { uchari; I2C_Start(); I2C_SendByte(wrDAdr2); I2C_WaitAck(); I2C_SendByte(wordAdr2); I2C_WaitAck(); I2C_Stop(); I2C_Start(); I2C_SendByte(rdDAdr2); I2C_WaitAck(); for(i=0;i {I2C_RcvByte(pRdDat+i); I2C_SendAck(); } I2C_RcvByte(pRdDat+i); I2C_SendNoAck(); I2C_Stop(); } /*-------------------------------------------------------------------- 函数名称: SI5338A写入registermap --------------------------------------------------------------------*/ voidsi5338_wrregmap(ucharaddr,ucharreg,uintReg_Num) { ucharcurr_val[1]; ucharclear_curr_val,clear_new_val,combined; //ignoreregisterswithmasksof0x00 if(Reg_Store[Reg_Num].Reg_Mask! =0x00) { if(Reg_Store[Reg_Num].Reg_Mask==0xFF) { //doaregularI2Cwritetotheregister //ataddrwiththedesireddatavalue I2C_Start();/*DisableOutputs,setreg230[4]=1*/ I2C_SendByte(addr|0); I2C_WaitAck(); I2C_SendByte(reg); I2C_WaitAck(); I2C_SendByte(Reg_Store[Reg_Num].Reg_Val); I2C_WaitAck(); I2C_Stop(); } else{ //doaread-modify-writeusingI2Cand //bit-wiseoperations //getthecurrentvaluefromthedeviceatthe //registerlocatedataddr I2C_RcvBytes(addr|0,reg,addr|1,curr_val,1); //clearthebitsthatareallowedtobe //accessedinthecurrentvalueoftheregister clear_curr_val=curr_val[0]&(~Reg_Store[reg].Reg_Mask); //clearthebitsinthedesireddatathat //arenotallowedtobeaccessed clear_new_val=Reg_Store[Reg_Num].Reg_Val&Reg_Store[reg].Reg_Mask; //combinetheclearedvaluestogetthenew //valuetowritetothedesiredregister combined=clear_curr_val|clear_new_val; I2C_Start();/*DisableOutputs,setreg230[4]=1*/ I2C_SendByte(addr|0); I2C_WaitAck(); I2C_SendByte(reg); I2C_WaitAck(); I2C_SendByte(combined); I2C_WaitAck(); I2C_Stop(); } } } /*-------------------------------------------------------------------- 函数名称: SI5338A写单寄存器 --------------------------------------------------------------------*/ voidsi5338_wrmask(ucharaddr,ucharreg,ucharmask,uchardat) { ucharcurr_val[1]; ucharclear_curr_val; ucharclear_new_val; ucharcombined; //ignoreregisterswithmasksof0x00 if(mask! =0x00) { if(mask==0xFF) { //doaregularI2Cwritetotheregister //ataddrwiththedesireddatavalue I2C_Start();/*DisableOutputs,setreg230[4]=1*/ I2C_SendByte(addr|0); I2C_WaitAck(); I2C_SendByte(reg); I2C_WaitAck(); I2C_SendByte(dat); I2C_WaitAck(); I2C_Stop(); } else{ //doaread-modify-writeusingI2Cand //bit-wiseoperations //getthecurrentvaluefromthedeviceatthe //registerlocatedataddr I2C_RcvBytes(addr|0,reg,addr|1,curr_val,1); //clearthebitsthatareallowedtobe //accessedinthecurrentvalueoftheregister clear_curr_val=curr_val[0]&(~mask); //clearthebitsinthedesireddatathat //arenotallowedtobeaccessed clear_new_val=dat&mask; //combinetheclearedvaluestogetthenew //valuetowritetothedesiredregister combined=clear_curr_val|clear_new_val; I2C_Start();/*DisableOutputs,setreg230[4]=1*/ I2C_SendByte(addr|0); I2C_WaitAck(); I2C_SendByte(reg); I2C_WaitAck(); I2C_SendByte(combined); I2C_WaitAck(); I2C_Stop(); } } } /*-------------------------------------------------------------------- 函数名称: 配置第一片SI5338A --------------------------------------------------------------------*/ voidsi5338_config1() { uinti; ucharreg1[1],reg2[1],reg3[1]; uchartime1=255; _nop_();/*DisableOutputs,setreg230[4]=1*/ I2C_Start(); I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0xE6); I2C_WaitAck(); I2C_SendByte(0x1F); I2C_WaitAck(); I2C_Stop(); _nop_();/*PauseLOL,setreg241[7]=1*/ I2C_Start(); I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0xF1); I2C_WaitAck(); I2C_SendByte(0x85); I2C_WaitAck(); I2C_Stop(); for(i=0;i<349;i++)/*配置RegisterMap*/ { si5338_wrregmap(si5338_addr1|0,Reg_Store[i].Reg_Addr,i); } _nop_();/*ConfigurePLLforlocking,setreg49[7]=0*/ I2C_Start(); I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0x31); I2C_WaitAck(); I2C_SendByte(0x10); I2C_WaitAck(); I2C_Stop(); _nop_();/*InitiateLockingofPLL,setreg246[1]=1*/ I2C_Start(); I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0xF6); I2C_WaitAck(); I2C_SendByte(0x02); I2C_WaitAck(); I2C_Stop(); _nop_();/*RestartLOL,setreg241[7]=0*/ I2C_Start(); I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0xF1); I2C_WaitAck(); I2C_SendByte(0x05); I2C_WaitAck(); I2C_Stop(); DELAY_10(2500);/*wait25ms*/ I2C_Start();//isPLLlocked I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0xDA); I2C_WaitAck(); I2C_Stop(); I2C_Start(); I2C_SendByte(si5338_addr1|1); I2C_WaitAck(); I2C_RcvByte(reg1); I2C_SendNoAck(); I2C_Stop(); if((reg1[0]&0x11)! =0x00) { time1--; if(! time1)//超时值为255 { LOCK_PLL=FALSE; } DELAY(); } else { LOCK_PLL=TRUE; } _nop_();/*copy237[1: 0]to47[1: 0]*/ I2C_RcvBytes(si5338_addr1|0,0xED,si5338_addr1|1,reg1,1); I2C_RcvBytes(si5338_addr1|0,0x2F,si5338_addr1|1,reg2,1); reg3[0]=(reg1[0]&0x03)|(reg2[0]&0xFC); I2C_Start(); I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0x2F); I2C_WaitAck(); I2C_SendByte(reg3[0]); I2C_WaitAck(); I2C_Stop(); _nop_();/*copy236[7: 0]to46[7: 0]*/ I2C_RcvBytes(si5338_addr1|0,0xEC,si5338_addr1|1,reg1,1); I2C_Start(); I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0x2E); I2C_WaitAck(); I2C_SendByte(reg1[0]); I2C_WaitAck(); I2C_Stop(); _nop_();/*copy235[7: 0]to45[7: 0]*/ I2C_RcvBytes(si5338_addr1|0,0xEB,si5338_addr1|1,reg1,1); I2C_Start(); I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0x2D); I2C_WaitAck(); I2C_SendByte(reg1[0]); I2C_WaitAck(); I2C_Stop(); _nop_();/*set47[7: 2]=000101b*/ I2C_RcvBytes(si5338_addr1|0,0x2F,si5338_addr1|1,reg1,1); reg2[0]=(reg1[0]&0x03)|0x14; I2C_Start(); I2C_SendByte(si5338_addr1|0); I2C_WaitAck(); I2C_SendByte(0x2F); I2C_WaitAck(); I2C_SendByte(reg2[0]); I2C_WaitAck(); I2C_Stop(); _nop_();/*SetPLLtouseFCALvalues,setreg49[7]=1*/ I2C_Start(); I2C_SendByte(si5338_add
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SI5338AI2C 配置 程序