?? main.c
字號:
/*--------------------------------------------------------*/
/* 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 + -