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

📄 main.c

📁 单片机FM收音机芯片(cs1100)程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*--------------------------------------------------------*/
/* 2007-8-9 9:58 */
/*--------------------------------------------------------*/
#include <avr/interrupt.h>
#include <string.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/boot.h>
#include <util/twi.h>
#include <avr/wdt.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
/*--------------------------------------------------------*/
#define SIM_IIC_SCL_HIGH()                      (PORTC |= 0x20)     //PC5
#define SIM_IIC_SCL_LOW()                       (PORTC &= 0xDF)

#define SIM_IIC_SDA_HIGH()                      (PORTC |= 0x10)     //PC4
#define SIM_IIC_SDA_LOW()                       (PORTC &= 0xEF)

#define SIM_IIC_SDA_Output_status()             (DDRC |= 0x10)
#define SIM_IIC_SDA_Input_status()              (DDRC &= 0xEF)
#define ReadSimIICSDA()                         (PINC&0x10)
#define STREAM_COMP_BIT                         0x10

volatile unsigned int frequency_1 = 8750;
#define ISSUE_CHANNEL 													10400
#define ISSUE_CHANNEL_1 												8750

/*--------------------------------------------------------*/
#define NOP()                                   asm("nop")
#define FOSC                                    7372800
#define BAUD                                    115200
/*--------------------------------------------------------*/
#define MAX_COMM_REPEAT_TIMES                   200
/*--------------------------------------------------------*/

#define MAX_SERIAL_SEND_BUFF_LEN                16
volatile unsigned char serial_send_buff[MAX_SERIAL_SEND_BUFF_LEN];
volatile unsigned char g_ucSerialSendCounter;
volatile unsigned char g_ucSerialCurSendTotalCounter;
volatile unsigned char g_ucSerialReceBuf;
volatile unsigned char CS1100ControlData[32];
unsigned char volume_count = 0x08;
unsigned char CS1100_Power_down_up_count = 0;
unsigned char CS1100_PA_TUNER_MODE_count = 0;

unsigned int FREQUENCY = 8750;   //start frequency is 87.5MHz   end frequency is 108MHz

#define TEST_BIT(value, bitmask)            (((value) & (1<<bitmask)) == (1<<bitmask))
#define SET_BIT(value, bitmask)             (value |= (1<<bitmask))
#define CLEAR_BIT(value, bitmask)           (value &= ~(1<<bitmask))
#define BIT0                                0
#define BIT1                                1
#define BIT2                                2
#define BIT3                                3
#define BIT4                                4
#define BIT5                                5
#define BIT6                                6
#define BIT7                                7

volatile unsigned char g_ucByteFlag0;
#define b_serial_active                     BIT0
#define b_sim_iic_comm_error                BIT1
#define b_serial_frame_head_byte            BIT2
#define b_serial_subaddress_flag            BIT3
#define b_serial_length_flag                BIT4

void Write_AR0_and_PR0(void);
void Write_G0(void);
void Send_Const_String_to_Device(unsigned char length, unsigned char * p_string);
void ReadAAC(void);
void TransCh(void);
void GenerateCh(void);
void GenerateNewCiSki(void);
void Read_Ci(void);
void GenerateRandom(void);
void ProcessSerialSend(unsigned char frame_code);


void PutChar(unsigned char send_char)
{
    cli();
    cli();
    while(!(UCSR0A & (1<<UDRE0)));
    UDR0 = send_char;
    while(!(UCSR0A & (1<<UDRE0)));
    sei();
}

#define ENABLE_SERIAL_FUNCTION

#ifdef ENABLE_SERIAL_FUNCTION
void PutAscii(unsigned char hex_data)
{
    unsigned char temp;
    temp = hex_data>>4;
    if(temp<10) temp += 48;
    else temp += 55;
    PutChar(temp);
    
    temp = hex_data&0x0f;
    if(temp<10) temp += 48;
    else temp += 55;
    PutChar(temp);
}

unsigned char GetStringLength(const unsigned char *_str)
{
    unsigned char _cnt_=0;
    while((*_str++)!='\0') ++_cnt_;
    return (_cnt_);
}

void PutEnterChar(void)
{
    PutChar(0x0D);
    PutChar(0x0A);
}

void PutString(const unsigned char * string_pointer)
{
    unsigned char i,str_len;
    const unsigned char *pointer;
    str_len = GetStringLength(string_pointer);
    pointer = string_pointer;
    for(i=0; i<str_len; i++) PutChar(*pointer++);
		PutEnterChar();
}
#endif

void port_init(void)
{
    DDRD  = 0xfe;
    PORTD = 0xfe;
    DDRB  = 0xff;
    PORTB = 0xff;
    DDRC  = 0xff;
    PORTC = 0xff;
}

void uart_init(void)
{
	  UCSR0B = 0;
	  UCSR0A = 0x00;
	  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
    UBRR0L = (FOSC/16/BAUD - 1)%256;
	  UBRR0H = (FOSC/16/BAUD - 1)/256;
	  UCSR0B = (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0) | (1<<TXCIE0);
}

ISR(USART_RX_vect)
{
    g_ucSerialReceBuf = UDR0;
    if(!TEST_BIT(g_ucByteFlag0, b_serial_frame_head_byte))
			SET_BIT(g_ucByteFlag0, b_serial_frame_head_byte);
}

ISR(USART_TX_vect)
{
    if(g_ucSerialSendCounter++ < g_ucSerialCurSendTotalCounter)
    {
        UDR0 = serial_send_buff[g_ucSerialSendCounter];
    }
}

void delay_ms(unsigned char delay)
{
    while(delay>0) delay--;
}

void sim_iic_start(void)
{
    SIM_IIC_SDA_LOW();
    SIM_IIC_SCL_LOW();
    delay_ms(1);
    SIM_IIC_SDA_HIGH();
    delay_ms(2);
    SIM_IIC_SCL_HIGH();
    delay_ms(2);
    SIM_IIC_SDA_LOW();
    delay_ms(2);
    SIM_IIC_SCL_LOW();
}

void sim_iic_stop(void)
{
    SIM_IIC_SDA_LOW();
    SIM_IIC_SCL_HIGH();
    delay_ms(2);
    SIM_IIC_SDA_HIGH();
    delay_ms(2);
    SIM_IIC_SCL_LOW();
    delay_ms(2);
    SIM_IIC_SDA_LOW();
}

unsigned char sim_iic_write_byte_to_device(unsigned char send_data)
{
    unsigned char i;
    unsigned char return_value;

    for(i=0; i<8; i++)
    {
        if((send_data & 0x80) == 0x80) SIM_IIC_SDA_HIGH();
        else SIM_IIC_SDA_LOW();
        delay_ms(2);
        SIM_IIC_SCL_HIGH();
        delay_ms(4);
        SIM_IIC_SCL_LOW();
        send_data <<= 1;
    }

    SIM_IIC_SDA_Input_status();       //check ACK
    SIM_IIC_SDA_Input_status();
    delay_ms(1);
    SIM_IIC_SCL_HIGH();
    delay_ms(2);
    i = ReadSimIICSDA();
    i = ReadSimIICSDA();
    delay_ms(1);
    SIM_IIC_SCL_LOW();
    i = ReadSimIICSDA();

    if(i == STREAM_COMP_BIT)
    {
        if(!TEST_BIT(g_ucByteFlag0, b_sim_iic_comm_error))
        {
            SET_BIT(g_ucByteFlag0, b_sim_iic_comm_error);
        }
        return_value = 0;
    }
    else
    {
    		return_value = 1;
    }
    
    SIM_IIC_SDA_Output_status();
    SIM_IIC_SDA_Output_status();
    return return_value;
}

unsigned char sim_iic_read_byte_from_device(void)
{
    unsigned char i;
    unsigned char bit_data;
    unsigned char byte_data=0;

    SIM_IIC_SDA_Input_status();
    SIM_IIC_SDA_Input_status();
    for(i=0; i<8; i++)
    {
        byte_data <<= 1;
        SIM_IIC_SCL_HIGH();
        delay_ms(2);
        bit_data = ReadSimIICSDA();
        SIM_IIC_SCL_LOW();
        //if(bit_data == STREAM_COMP_BIT) byte_data += 1;
        if((bit_data&STREAM_COMP_BIT)==STREAM_COMP_BIT) byte_data += 1;
        else byte_data += 0;
    }
    SIM_IIC_SDA_Output_status();            // answer ack
    SIM_IIC_SDA_Output_status();
    SIM_IIC_SDA_LOW();
    delay_ms(2);
    SIM_IIC_SCL_HIGH();
    delay_ms(4);
    SIM_IIC_SCL_LOW();
    SIM_IIC_SDA_HIGH();
    return byte_data;
}
/***********************************************************************/
void CS1100_FMTune(unsigned int TunerFrequency)
{
	unsigned int ch = 0;

	// frequency transfer to channel number,  channel=(frequencyMhz-60)/0.05, e.g. 87.5Mhz->550
	ch = (TunerFrequency - 6000)/5; 

	// set channel number 
	CS1100ControlData[2] &= 0xfc;
	CS1100ControlData[2] |= (ch & 0x0300)>>8;
	CS1100ControlData[3] =	ch & 0xff;

	// tune function
	CS1100ControlData[0] &= 0xdf;// mute off
	CS1100ControlData[0] &= 0xfd;// tune=0
	
	sim_iic_start();
	sim_iic_write_byte_to_device(0x20);
	sim_iic_write_byte_to_device(CS1100ControlData[0]);
	sim_iic_write_byte_to_device(CS1100ControlData[1]);
	sim_iic_write_byte_to_device(CS1100ControlData[2]);
	sim_iic_write_byte_to_device(CS1100ControlData[3]);
	sim_iic_stop();

	CS1100ControlData[0] |= 0x02;//tune=1, begin tune operaton

	sim_iic_start();
	sim_iic_write_byte_to_device(0x20);
	sim_iic_write_byte_to_device(CS1100ControlData[0]);
	sim_iic_stop();
}


#define OUTPUT_CS1100_REGISTER

int CS1100_FMSeek_TuneMethod(unsigned int TunerFrequency, signed short *pryFD)
{
	  unsigned int ch = 0;
    unsigned char snr,rssi,st,loop;
	  unsigned char fd;
	  unsigned char seekover, stcflag;
    unsigned int Temp[27] = { 0x00 };

    
	  // frequency transfer to channel number,  channel=(frequencyMHz-60)/0.05, e.g. 87.5Mhz->550
	  ch = (TunerFrequency - 6000)/5;
	  CS1100ControlData[2] &= 0xfc;
	  CS1100ControlData[2] |= (ch & 0x0300)>>8;
	  CS1100ControlData[3] =	ch & 0xff;

    sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_write_byte_to_device(CS1100ControlData[1]);
		sim_iic_write_byte_to_device(CS1100ControlData[2]);
		sim_iic_write_byte_to_device(CS1100ControlData[3]);
		sim_iic_stop();

	  // seek operation
	  CS1100ControlData[0] |= 0x20; //mute on
	  CS1100ControlData[0] &= 0xfd; //tune=0

	  sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_stop();

	  CS1100ControlData[0] |= 0x02; // TUNE=1, begin tune operation

	  sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_stop();

	  delay_ms(50);

	  // read STC indicator and judgement of seek threshold
	  seekover=0;
	  stcflag=0;

	  loop=0;
    do
	  {
	      sim_iic_start();
				sim_iic_write_byte_to_device(0x21);
				
				#ifdef OUTPUT_CS1100_REGISTER
				PutChar(' ');
				Temp[0] = sim_iic_read_byte_from_device();
				PutAscii(Temp[0]);
				PutChar(' ');
				Temp[1] = sim_iic_read_byte_from_device();
				PutAscii(Temp[1]);
				PutChar(' ');
				Temp[2] = sim_iic_read_byte_from_device();
				PutAscii(Temp[2]);
				PutChar(' ');
				Temp[3] = sim_iic_read_byte_from_device();
				PutAscii(Temp[3]);
				PutChar(' ');
				Temp[4] = sim_iic_read_byte_from_device();
				PutAscii(Temp[4]);
				PutChar(' ');
				Temp[5] = sim_iic_read_byte_from_device();
				PutAscii(Temp[5]);
				sim_iic_stop();
				PutChar(0x0d);
				PutChar(0x0a);
				#else
				Temp[0] = sim_iic_read_byte_from_device();
				Temp[1] = sim_iic_read_byte_from_device();
				Temp[2] = sim_iic_read_byte_from_device();
				Temp[3] = sim_iic_read_byte_from_device();
				Temp[4] = sim_iic_read_byte_from_device();
				Temp[5] = sim_iic_read_byte_from_device();
				sim_iic_stop();
				#endif

⌨️ 快捷键说明

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