⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qam.c

📁 本人用avr 单片机atmega128开发控制产品的源码。
💻 C
字号:
/*function: control 3033 qam modulator.*/
#include <iom128v.h>
#include "Twi.h"
#include "qam.h"
#include <control.h>

unsigned char charmp[5],byWrite;
unsigned char ucaTemp[5],byTemp[5];
unsigned char temp_number;

extern unsigned int    iSmbRat;	
extern unsigned char  center_frequency,qammode;

//---------------------------------------------------------
// NAME:	SetSymbolRate()
// ENTRY:	iFBaud
// RETURN:	void
// FUNCTION:Set qam SymbolRate
// MODIFY:	2004.2.3
//--------------------------------------------------------
void SetSymbolRate(int iFBaud)
{
	unsigned long ulData[2];
	ulData[0]=(unsigned long)iFBaud;
	ulData[1]=ulData[0]*2483/7125;
	ulData[0]*=1177;
	ulData[0]+=ulData[1];
	ucaTemp[2]=(unsigned char)(ulData[0]%256);
	ulData[0]/=256;
	ucaTemp[1]=(unsigned char)(ulData[0]%256);
	ulData[0]/=256;
	ucaTemp[0]=(unsigned char)(ulData[0]%256);
	ucaTemp[3]=0;
	ucaTemp[4]=0;
}
//---------------------------------------------------------
// NAME:	broad_3033_init()
// ENTRY:	qam,addr
// RETURN:	void
// FUNCTION:Init the chip 3033
// MODIFY:	2004.2.3
//--------------------------------------------------------
void broad_3033_init(unsigned char qam,unsigned char addr)
{
	unsigned char byWrite;
	unsigned char charmp[7];
	/* 读芯片的信息 */
	//ReadBCM3033Info(qam,addr);
	/* 设置保留寄存器 */
	byWrite = 0x00;
	i2c_Write(byWrite,0x08,qam,addr);
	/* 设置复位控制寄存器 */
	byWrite =0x1c;            //0x1f;    //02-07-25;       //0x1c;
	i2c_Write(byWrite,0x0d,qam,addr);
	delayms(20);
	/* 设置复位控制寄存器 */
	byWrite = 0x20;
	i2c_Write(byWrite,0x0d,qam,addr);
	delayms(10);
	/* 设置QAM模式控制寄存器 05:0b*/
	switch( qammode )
	{
	case 1://the last three bits  000    001      010     011              100      101      110       111
		//QPSK: 16-QAM   32-QAM  64-QAM(default)  128-QAM  256-QAM  Reserved  Reserved
		byWrite=0x09;
		break;
	case 2:
		byWrite=0x0a;
		break;
	case 3:
		byWrite=0x0b;
		break;
	case 4:
		byWrite=0x0c;
		break;
	case 5:
		byWrite=0x0d;
		break;
	default:
		break;
	}
	//设置模式
	//the last three bits   000    001      010     011              100      101      110       111
	//                QPSK         16-QAM   32-QAM  64-QAM(default)  128-QAM  256-QAM  Reserved  Reserved
	i2c_Write(byWrite,0x05,qam,addr);
	delayms(5);
	/* 设置编码模式控制寄存器 06:0a*/
	byWrite = 0x0a;
	i2c_Write(byWrite,0x06,qam,addr);
	delayms(5);
	/* 设置复位控制寄存器 */
	byWrite = 0x1C;
	i2c_Write(byWrite,0x0d,qam,addr);
	delayms(10);
	
	/* 设置伪随机二进制序列产生控制寄存器 0e:00*/
	byWrite = 0x00;
	i2c_Write(byWrite,0x0e,qam,addr);
	delayms(5);
	
	/* 设置交织深度控制寄存器 09:05*/
	byWrite = 0x05;
	i2c_Write(byWrite,0x09,qam,addr);
	delayms(5);
	
	/* 设置复位控制寄存器 */
	byWrite = 0x1C;
	i2c_Write(byWrite,0x0d,qam,addr);
	delayms(10);
	/* 设置输入控制寄存器 0a:03*/
	byWrite= 0x23;  //主模式
	//byWrite= 0x22;  //从模式
	i2c_Write(byWrite,0x0a,qam,addr);
	delayms(5);
	
	/* 设置复位控制寄存器 */
	byWrite = 0x1C;
	i2c_Write(byWrite,0x0d,qam,addr);
	delayms(10);
	
	/* 设置输出控制寄存器 0b:01*/
	byWrite = 0x01;
	i2c_Write(byWrite,0x0b,qam,addr);
	delayms(5);
	
	/* 设置复位控制寄存器 */
	byWrite = 0x01;
	i2c_Write(byWrite,0x0d,qam,addr);
	delayms(10);
	/*dbctl */
	byWrite=0x0b;
	i2c_Write(byWrite,0x13,qam,addr);
	delayms(10);
	
	/* 设置输入同步环线性系数 04,00,00,00,02*/
	/* 20H--23H 存储BCM3033的操作码02H对应的多字节寄存器 */
	/*操作码为02 的寄存器*/
	charmp[0]=0x04;
	charmp[1]=0x00;
	charmp[2]=0x00;
	charmp[3]=0x00;
	charmp[4]=0x02;
	i2c_Write_mbyte(charmp,0x00,5,qam,addr);
	delayms(10);
	/* 设置输入同步环积分器系数 00,04,00,00,01*/
	/* 1cH--1fH 存储BCM3033的操作码01H对应的多字节寄存器 */
	/*操作码为01 的寄存器*/
	charmp[0]=0x00;
	charmp[1]=0x04;
	charmp[2]=0x00;
	charmp[3]=0x00;
	charmp[4]=0x01;
	i2c_Write_mbyte(charmp,0x00,5,qam,addr);
	delayms(10);
	/* 设置符号率 */
	/*操作码为00 的寄存器
	公式:2^24*8*FBAUD/FMCLK       FMCLK=114
	*/
	//*FBAUD=6875Kbps--7b823e
	//6952=7CE45E
	//6MBaud--6BCA1A
	/*ucaTemp[0]=0x7d;//3100kBaud
	ucaTemp[1]=0xc1;
	ucaTemp[2]=0x1f;
	ucaTemp[3]=0x00;
	ucaTemp[4]=0x00;*/
	SetSymbolRate(iSmbRat);
	i2c_Write_mbyte(ucaTemp,0x00,5,qam,addr);
	delayms(10);
	/* 设置输入同步环积分器 00,00,00,00,03*/
	/* 24H--27H 存储BCM3033的操作码03H对应的多字节寄存器 */
	/*操作码为03 的寄存器*/
	charmp[0]=0x00;
	charmp[1]=0x00;
	charmp[2]=0x00;
	charmp[3]=0x00;
	charmp[4]=0x03;
	i2c_Write_mbyte(charmp,0x00,5,qam,addr);
	delayms(10);
	/* 设置输入同步环使能 00,0c,44,00,04*/
	/* 28H--2bH 存储BCM3033的操作码04H对应的多字节寄存器 */
	/*操作码为04 的寄存器*/
	charmp[0]=0x00;
	charmp[1]=0x0c;
	charmp[2]=0x44;
	charmp[3]=0x00;
	charmp[4]=0x04;
	i2c_Write_mbyte(charmp,0x00,5,qam,addr);
	delayms(10);
	/* 设置复位控制寄存器 */
	byWrite =  0x1c;
	i2c_Write(byWrite,0x0d,qam,addr);
	delayms(10);
	/* 设置复位控制寄存器 */
	byWrite = 0x20;
	i2c_Write(byWrite,0x0d,qam,addr);
	delayms(10);
	/* 读同步寄存器 */
	i2c_Read(&charmp[0],0x12,qam,addr);
	delayms(20);
	i2c_Read(&charmp[0],0x10,qam,addr);
	i2c_Read(&charmp[0],0x0f,qam,addr);
	i2c_Read(&charmp[0],0x14,qam,addr);
	i2c_Read(&charmp[0],0x17,qam,addr);
//	ReadBCM3033Info(qam,addr);
	i2c_Read(&charmp[0],0x0a,qam,addr);
	
	/* 设置中心频率(FIF=38M ,FS=FMCLK=114)*/
	//IF=38M  unsigned charmp[0..4]=55,55,55,55,08
	//IF=36.15 unsigned charmp[0..4]=51,2d,cf,7e,08
	//IF=36.65 unsigned charmp[0..4]=52,4d,3f,c6,08
	switch (center_frequency)
	{
	case 0x01:
		{
			charmp[0]=0x51;
			charmp[1]=0x2d;
			charmp[2]=0xcf;
			charmp[3]=0x7e;
			charmp[4]=0x08;
			break;
		}
	case 0x02:
		{
			charmp[0]=0x52;
			charmp[1]=0x4d;
			charmp[2]=0x3f;
			charmp[3]=0xc6;
			charmp[4]=0x08;
			break;
		}
	case 0x03:
		{
			charmp[0]=0x55;
			charmp[1]=0x55;
			charmp[2]=0x55;
			charmp[3]=0x55;
			charmp[4]=0x08;
			break;
		}
	default:
		{
			break;
		}
	}
	i2c_Write_mbyte(charmp,0x00,5,qam,addr);
	
	/* 设置输出采样时钟使能 00,00,00,00,09*/
	/*操作码为09 的寄存器*/
	charmp[0]=0x00;
	charmp[1]=0x00;
	charmp[2]=0x00;
	charmp[3]=0x00;
	charmp[4]=0x09;
	i2c_Write_mbyte(charmp,0x00,5,qam,addr);
	i2c_Read(&charmp[0],0x12,qam,addr);
}
//---------------------------------------------------------
// NAME:	ReadBCM3033Info()
// ENTRY:	chanl,.
//		addr,.
// RETURN:   if success return TRUE, otherwise return FALSE.
// FUNCTION:Read the chip 3033 ID
// MODIFY:	2004.2.3             
//--------------------------------------------------------
unsigned char ReadBCM3033Info(unsigned char chanl, unsigned char addr)
{
	unsigned char  byTemp[7];
	
	byTemp[0] = 0x0a;
	i2c_Write(byTemp[0], 0x04, chanl, addr);
	delayms(5);
	// the bytes read from BCM3033 is (LSB)0x00 0x02 0x0B 0xD9(MSB)
	i2c_Read(&byTemp[2], 0x02, chanl, addr);  
	i2c_Read(&byTemp[3], 0x03, chanl, addr);  
	if((byTemp[2] == 0x0B) && (byTemp[3] == 0xD9))
		return TRUE;
	else
		return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -