本帖最后由 simuel 于 2017-5-8 16:04 編輯
最近想做個FM電臺,找到了QN8027,把圖畫好了,PCB也做好了,然后程序寫進去發現輸出沒信號,檢測晶振也不工作。
電路圖:
無標題.png (24.38 KB, 下載次數: 131)
下載附件
2017-5-8 15:39 上傳
程序:
我用的IIC通信速率是200khz左右,我在PCF8591,PCF8563,24c02等芯片上都用過,都用了好幾年了,除了更換單片機后速率問題,修改過之后沒出過問題。
哪位大俠幫我瞧瞧,問題出在了哪里?
#include <STC15F2K60S2.H>
/************************************/
/* QN8027 */
/************************************/
sbit SDA=P3^3;
sbit SCL=P3^2;
/************************************/
/* KEY */
/************************************/
sbit key_set=P3^1;
sbit key_fun=P3^0;
void main ()
{
P3M0 = 0XFF; //P3口推挽
P3M1 = 0;
delay1ms(1000); //延時1s,使其他IC上電穩定
init_QN8027(); //初始化QN8027
while (1);
{
}
}
void delay1ms(uint z) //@12.000MHz
{
unsigned char i, j;
while(--z)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
void init_QN8027()
{
writebyte(0x00, 0x81); //將QN8027所有寄存器復位到缺省值
delay1ms (20);
writebyte(0x03, 0X0+0x3F);//設置QN8027時鐘信號,0x10為晶振,0x50外部正弦波時鐘輸入(與硬件設計相關) [5-0]晶振電流
writebyte(0x04, 0x08); //晶振頻率選擇 12Mhz,信號衰減
writebyte(0x00, 0x41); //QN8027有限狀態機校驗
writebyte(0x10, 0x7f); // max power
writebyte(0x00, 0x01); ////QN8027有限狀態機校驗freq high 2 bit
delay1ms (20);
writebyte(0x01, 0x0); // freq, about 107MHz
writebyte(0x02, 0x39); //關閉PA功能當沒有音頻信號輸入時的時間
writebyte(0x00, 0x22); //發射信號
delay1ms (20);
}
#define IIC_WRITER 0X58 //QN8027xie地址
#define IIC_READ 0X59 //QN8027讀地址
//uchar IIC_READ,IIC_WRITER;
//#define _Nop() _nop_();_nop_();_nop_();_nop_();_nop_() //FOCS=12MHZ,Fcsl=480KHZ ,T=900ns
//FOCS=12MHZ,Fcsl=180KHZ,T=2us
void _Nop() //@12.000MHz 延時2us,讀寫速度200khz
{
unsigned char i;
_nop_();
_nop_();
i = 3;
while (--i);
}
//===============================
//define a bit_operation byte to use in shift operation
//use this mode can achieve high operation speed
unsigned char bdata bbyte;
sbit a0=bbyte^0;
sbit a1=bbyte^1;
sbit a2=bbyte^2;
sbit a3=bbyte^3;
sbit a4=bbyte^4;
sbit a5=bbyte^5;
sbit a6=bbyte^6;
sbit a7=bbyte^7;
//========================================
bit IFACK;//record the SDA state to confirn if ACK has happened
//bit NO_ACK;//no ack flag
//bit BUS_FAULT; //bus fault flag
//bit IIC_BUSY; //bus is busy flay
//========================================
//FUNCTION:ROUTES TO PROVIDE A START SIGNAL
void start(void)
{
SCL=0;_Nop();SDA=1;_Nop();SCL=1;_Nop();SDA=0;_Nop();SCL=0;_Nop();
}
//=======================================
//FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
void stop(void)
{
// SCL=0;_nop_();SDA=0;_nop_();SCL=1;_nop_();SDA=1;_nop_();SCL=0;_nop_();
SCL=0;_Nop();SDA=0;_Nop();SCL=1;_Nop();SDA=1;_Nop();SCL=0;_Nop();
}
//FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
//OR TO PROVIDE A NO_ACK SIGNAL
bit nack(void)
{
SCL=0;_nop_();SDA=1;_nop_();SCL=1;_nop_();IFACK=SDA;_nop_();SCL=0;_nop_(); return IFACK;
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
unsigned char inbyte(void)
{
SDA=1;
SCL=1;_Nop();a7=SDA;SCL=0;_Nop();
SCL=1;_Nop();a6=SDA;SCL=0;_Nop();
SCL=1;_Nop();a5=SDA;SCL=0;_Nop();
SCL=1;_Nop();a4=SDA;SCL=0;_Nop();
SCL=1;_Nop();a3=SDA;SCL=0;_Nop();
SCL=1;_Nop();a2=SDA;SCL=0;_Nop();
SCL=1;_Nop();a1=SDA;SCL=0;_Nop();
SCL=1;_Nop();a0=SDA;SCL=0;_Nop();
return(bbyte);
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
void outbyte(unsigned char outdata)
{
bbyte=outdata;
SDA=a7;_Nop();SCL=1;_Nop();SCL=0;_Nop();
SDA=a6;_Nop();SCL=1;_Nop();SCL=0;_Nop();
SDA=a5;_Nop();SCL=1;_Nop();SCL=0;_Nop();
SDA=a4;_Nop();SCL=1;_Nop();SCL=0;_Nop();
SDA=a3;_Nop();SCL=1;_Nop();SCL=0;_Nop();
SDA=a2;_Nop();SCL=1;_Nop();SCL=0;_Nop();
SDA=a1;_Nop();SCL=1;_Nop();SCL=0;_Nop();
SDA=a0;_Nop();SCL=1;_Nop();SCL=0;_Nop();
nack();
}
//======================================================
//FUNCTION:BYTE WRITE.
// 'add' THE WRITE ADDRESS,
// 'wbyte' THE DATA WANT TO WRITE
void writebyte(unsigned char add,unsigned char wbyte)
{
start();
outbyte(IIC_WRITER);
nack();
outbyte(add);
nack();
outbyte(wbyte);
nack();
stop();
}
//=====================================================
//FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ
unsigned char readbyte (unsigned char add)
{
unsigned char temp;
start();
outbyte(IIC_WRITER);
nack();
outbyte(add);
nack();
start();
outbyte(IIC_READ);
nack();
temp=inbyte();
nack();
stop();
return(temp);
}
|