📄 card.cpp
字号:
PORTD &= ~FM_DATA;
//DelayUs(6);
//PORTD &= ~FM_CLK;
//DelayUs(6);
PORTD |= FM_CLK;
DelayUs(6);
PORTD |= FM_DATA;
DelayUs(6);
}
////////////
void NoAck(void)
{
PORTD |= FM_DATA;
DelayUs(6);
PORTD |= FM_CLK;
DelayUs(6);
PORTD &= ~FM_CLK;
DelayUs(6);
//PORTD &= ~FM_DATA;
//DelayUs(6);
}
/////////////
unsigned char I2cWriteByte(unsigned char byte)
{
unsigned char counts,ack;
counts = 0;
ack = TRUE;
while(counts < 8)
{
asm("wdr");
if(byte & 0x80)
{
PORTD |= FM_DATA;
}
else
{
PORTD &= ~FM_DATA;
}
DelayUs(3);
PORTD |= FM_CLK;
DelayUs(6);
PORTD &= ~FM_CLK;
DelayUs(3);
counts++;
byte <<= 1;
}
PORTD &= ~FM_DATA;
DDRD &= ~FM_DATA;
DelayUs(6);
PORTD |= FM_CLK;
DelayUs(6);
if(PIND & FM_DATA)
{
ack = FALSE;
}
//PORTD &= ~FM_CLK;
DelayUs(3);
//PORTD |= FM_DATA;
//DelayUs(6);
DDRD |= FM_DATA;
DelayUs(6);
return ack;
}
///////////
unsigned char I2cWriteByteData(unsigned char I2cAddress,unsigned char data)
{
unsigned char counts = 0,result = FALSE;
while(counts < 3)
{
I2cStart();
if(I2cWriteByte(0x6c) == TRUE)
{
if(I2cWriteByte(I2cAddress) == TRUE)
{
if(I2cWriteByte(data) == TRUE)
{
I2cStop();
result = TRUE;
break;
}
}
}
I2cStop();
asm("wdr");
counts++;
}
return result;
}
///////////////
void KT0801Configuration(unsigned int wFMFrequence)
{
unsigned char FrequenceLow,FrequenceHigh;
I2cWriteByteData(0x02,(ENABLE_MUTE|PILOT_PRE_EMPH_AMPL));
FrequenceLow = *(char *)&wFMFrequence;
FrequenceHigh = *((char *)&wFMFrequence + 1);
FrequenceHigh |= RF_AUDIO_GAIN;
I2cWriteByteData(0x00,FrequenceLow);
I2cWriteByteData(0x01,FrequenceHigh);
I2cWriteByteData(0x13,ENABLE_HIGH_POWER);
wStatusDelay = 0;
while(wStatusDelay < MS_20)
{
asm("wdr");
}
I2cWriteByteData(0x02,((~ENABLE_MUTE)&PILOT_PRE_EMPH_AMPL));
}
////////
void FMFrequeceControl(unsigned int wFMFrequence)
{
unsigned char FrequenceLow,FrequenceHigh;
FrequenceLow = *(char *)&wFMFrequence;
FrequenceHigh = *((char *)&wFMFrequence + 1);
FrequenceHigh |= RF_AUDIO_GAIN;
I2cWriteByteData(0x00,FrequenceLow);
I2cWriteByteData(0x01,FrequenceHigh);
}
//void DisplayMode(void)
//{
//}
//cLCD LCD;
/*
void PresetFMFrequenceAndMode(void)
{
FMFrequenceAndMode.wModeFrequenceValue[0] = FM_FREQUENCE_MODE1;
FMFrequenceAndMode.wModeFrequenceValue[1] = FM_FREQUENCE_MODE2;
FMFrequenceAndMode.wModeFrequenceValue[2] = FM_FREQUENCE_MODE3;
FMFrequenceAndMode.wModeFrequenceValue[3] = FM_FREQUENCE_MODE;
FMFrequenceAndMode.wModeFrequenceValue[4] = FM_FREQUENCE_MODE4;
FMFrequenceAndMode.FMFrequence.wFMFrequence = FM_PRESET_FREQUENCE;
FMFrequenceAndMode.FMFrequenceMode = NO_M;
}
unsigned char ReadFMFrequenceAndMode(FMFrequence *FMFrequenceAndMode)
{
unsigned char i,temp = 0;
for(i = 0;i < EEPROM_FREQUENCE_DATA_LEN;i++)
{
*(unsigned char *)((unsigned char *)FMFrequenceAndMode + i) = eeprom_read_byte((const uint8_t *)((wFMFrequenceAndModeAddress) + i));
}
for(i = 0;i < (EEPROM_FREQUENCE_DATA_LEN - 1);i++)
{
temp += *(unsigned char *)((unsigned char *)FMFrequenceAndMode + i);
}
if(temp == *(unsigned char *)((unsigned char *)FMFrequenceAndMode + (EEPROM_FREQUENCE_DATA_LEN - 1)))
{
return TRUE;
}
else
{
return FALSE;
}
}
///
unsigned char WriteFMFrequenceAndMode(void)
{
unsigned char i,j,temp = 0;
unsigned char bWriteEeprom;
FMFrequence lFMFrequenceAndMode;
bWriteEeprom = FALSE;
for(j = 0;j < EEPROM_RW_RETRY_COUNTS;j++)
{
for(i = 0;i < (EEPROM_FREQUENCE_DATA_LEN - 1);i++)
{
while (!eeprom_is_ready())
{
asm("wdr");
}
eeprom_write_byte((uint8_t *)((wFMFrequenceAndModeAddress) + i),*(unsigned char *)((unsigned char *)&FMFrequenceAndMode + i));
temp += *(unsigned char *)((unsigned char *)&FMFrequenceAndMode + i);
}
while (!eeprom_is_ready())
{
asm("wdr");
}
eeprom_write_byte((uint8_t *)((wFMFrequenceAndModeAddress) + (EEPROM_FREQUENCE_DATA_LEN - 1)),temp);
while (!eeprom_is_ready())
{
asm("wdr");
}
temp = ReadFMFrequenceAndMode(&lFMFrequenceAndMode);
if(temp == TRUE)
{
bWriteEeprom = TRUE;
break;
}
}
return bWriteEeprom;
}
///////////////
void WriteFMFrequenceAndModeAddress(void)
{
unsigned char i;
unsigned int temp;
for(i = 0;i < EEPROM_RW_RETRY_COUNTS;i++)
{
while (!eeprom_is_ready())
{
asm("wdr");
}
eeprom_write_word(&FMFrequenceEepromAddress,wFMFrequenceAndModeAddress);
while (!eeprom_is_ready())
{
asm("wdr");
}
eeprom_write_word(&FMFrequenceEepromAddress1,wFMFrequenceAndModeAddress);
while (!eeprom_is_ready())
{
asm("wdr");
}
temp = eeprom_read_word(&FMFrequenceEepromAddress);
if(temp == eeprom_read_word(&FMFrequenceEepromAddress1))
{
break;
}
}
}
/////////
//////////////when ReleaseKey that data is saved
void WriteFMF_data_to_eeprom(void)
{
if(bReleaseKey == TRUE) //&& FMTxStatus != CP_RESET_DELAY_STATUS)
{
if(bFMFrequenceChange == TRUE)
{
bFMFrequenceChange = FALSE;
while(wFMFrequenceAndModeAddress < (256 - EEPROM_FREQUENCE_DATA_LEN))
{
if(WriteFMFrequenceAndMode() == TRUE)
{
break;
}
wFMFrequenceAndModeAddress += EEPROM_FREQUENCE_DATA_LEN;
WriteFMFrequenceAndModeAddress();
}
}
}
}
*/
////////////sub progam in main program
void ipod_power_test(void) //IPOD 上电检测
{
if((FlagBuff1 & INSERT_IPOD) && (FlagBuff & IPOD_POWER_UP))
{
if(!(FlagBuff & IPOD_POWER_UP_HOLD))
{
FlagBuff |= IPOD_POWER_UP_HOLD; //IPOD刚上电延时等待稳定标志
IpodPowerUpDelay = 0;
}
else
{
if(!(FlagBuff1 & IPOD_POWER_STEADY))
{
if(IpodPowerUpDelay > MS_120)
{
FlagBuff1 |= IPOD_POWER_STEADY; //进入稳定状态
TxBuff[0] = 0xff; //发送同步字节SYNC
WriteUart(1,UN_WAIT_TX);
FMTxStatus = TX_SYN_CODE_STATUS; //CP进入初始化等待状态,发送授权命令
wStatusDelay = 0;
bTxCommand = TRUE;
TxRetryCounts1 = TX_RETRY_COUNTS; //发送PACK字节长度
}
}
}
}
else if(!(FlagBuff1 & INSERT_IPOD) || !(FlagBuff & IPOD_POWER_UP))
{
if(FlagBuff1 & IPOD_POWER_STEADY)
{
UartReceive = UART_RECEIVE;
bTxCommand = FALSE;
bTxCommand1 = FALSE;
FMTxStatus = NO_IPOD_CONNECT_STATUS;
bTxBuffLock = FALSE;
FlagBuff &= (~IPOD_POWER_UP & ~IPOD_POWER_UP_HOLD);
FlagBuff1 &= (~IPOD_POWER_STEADY & ~GET_IPOD_PLAY_STATUS);
}
}
}
///////////////
void get_ipod_play_staus(void)
{
ReadFlash(TxBuff,(prog_uchar *)GetPlayStatus,GET_PLAY_STATUS_LEN);
WriteUart(GET_PLAY_STATUS_LEN,WAIT_TX);
}
//////////////ipod Authentication and send pack
void ipod_receiving_pack(void)
{
if(FlagBuff1 & IPOD_POWER_STEADY)
{
if(UartReceive == UART_IS_RECEIVING) //start of packet(0x55)是否接收成功
{
if(RxTimeOut > MS_300)
{
UartReceive = UART_RECEIVE; //接收时间若大于300MS,则接收失败,从新接收
}
}
if(UartReceive == UART_RECEIVE_ONE_PACKET) //数据包是否接收完成
{
UartReceive = UART_RECEIVE;
switch(RxBuff[1])
{
case DISPLAY_REMOTE_LINGO: //Lingo ID 判断
switch(RxBuff[2]) //Command ID 判断
{
case RET_PLAY_STATUS: //播放状态
// FlagBuff1 |= GET_IPOD_PLAY_STATUS;
if((RxBuff[3] == 0x00) || (RxBuff[3] == 0x02))
{
if(!(FlagBuff & BT_AUDIO_ON))
{
FlagBuff1 &= ~IPOD_PLAY;
SendContextButtonStatus(PLAY);
}
}
else
{
FlagBuff1 |= IPOD_PLAY;
SendContextButtonStatus(PAUSE);//PRESS_PAUSE_KEY);
FMTxStatus1 = CONTEX_BOTTON_PRESS_STATUS;
bTxCommand1 = TRUE;
wStatusDelay1 = 0;
}
break;
default:
break;
}
break;
case GENERAL_LINGO: //Lingo ID 判断
switch(RxBuff[2]) //Command ID 判断
{
case REQUEST_IDENTIFY: //请求AC从新发送认证信息
FMTxStatus = TX_SYN_CODE_STATUS;
TxRetryCounts = TX_RETRY_COUNTS;
TxRetryCounts1 = TX_RETRY_COUNTS;
bTxCommand = TRUE;
wStatusDelay = 0;
break;
/*
case NOTIFY_IPOD_STATE_CHANGE:
if(RxBuff[3] == LIGHT_SLEEP)
{
iPodPowerStatus = LIGHT_SLEEP;
}
if(RxBuff[3] == POWER_ON)
{
iPodPowerStatus = POWER_ON;
}
break;*/
case GET_ACCESSORY_INFO: //IPOD获取AC相关信息
switch(RxBuff[3])
{
case ACCESSORY_CAPABILITIES:
ReadFlash(TxBuff,(prog_uchar *)RetAccessoryCapbilites,RET_ACCESSORY_CAPBILITES_LEN);
WriteUart(RET_ACCESSORY_CAPBILITES_LEN,WAIT_TX);
break;
/*
case ACCESSORY_NAME:
ReadFlash(TxBuff,(prog_uchar *)RetAccessoryName,RET_ACCESSORY_NAME_LEN);
WriteUart(RET_ACCESSORY_NAME_LEN,WAIT_TX);
break;
//case ACCESSORY_FIRMARE_VERSION:
//ReadFlash(TxBuff,(prog_uchar *)RetAccessoryFirmwareVer,RET_ACCESSORY_FIRMWARE_VER_LEN);
//WriteUart(RET_ACCESSORY_FIRMWARE_VER_LEN,WAIT_TX);
//break;*/
default:
break;
}
break;
case GET_DEV_AUTHENTICATION_INFO: //IPDO请求AC认证确认是否通过
SendDevAuthenticationInfo();
//FMTxStatus = AUTHENTICATION_PROCESS_STATUS;
TxRetryCounts = TX_RETRY_COUNTS; //重复发送几次
break;
case ACK_DEV_AUTHENTICATION_INFO: //应答确认信息
if(RxBuff[3] != ACK_OK)
{
if(TxRetryCounts > 0)
{
SendDevAuthenticationInfo();
TxRetryCounts--;
}
//else
//{
//SendIdentify();
//FMTxStatus = IDENTIFY_STATUS;
//}
}
break;
case GET_DEV_AUTHENTICATION_SIGNATURE:
#if defined AUTH_PROT_VER10
for(i = 0;i < 20;i++)
{
TxBuff[i] = RxBuff1[i];
}
#endif
#if defined AUTH_PROT_VER20
for(i = 0;i < 24;i++)
{
TxBuff[i] = RxBuff1[i];
}
#endif
SendDevAuthenticationSignature();
UartReceive = UART_RECEIVE;
break;
case ACK_AUTHENTICATION_STATUS:
if(RxBuff[3] == ACK_OK)
{
FMTxStatus = AUTHENTICATION_FINISH_STATUS; //IPOD 授权通过
SendSetIpodPreferences(); //发送建立CLASS ID
}
//else
//{
//if(AckAuthStatCoun == 0) //Permit to retry only twice
//{
//SendIdentify();
//FMTxStatus = IDENTIFY_STATUS;
//}
//}
break;
case ACK:
switch(RxBuff[4])
{
case IDENTIFY_DEVICE_LINGO: //发送COMMAND ID号
if(RxBuff[3] == ACK_OK)
{
//FMTxStatus = IDENTIFY_DEVICE_LINGO_STATUS;
FlagBuff1 |= IDENTIFY_ACK;
bTxCommand = FALSE;
}
else if(RxBuff[3] != ACK_PENDING)
{
if(TxRetryCounts > 0)
{
TxRetryCounts--;
FMTxStatus = CP_RESET_DELAY_STATUS; //等待收到完整的ACK数据包
IdentifyRetryCounts = IDENTIFY_RETRY_COUNTS;
FlagBuff1 &= ~IDENTIFY_ACK;
bTxCommand = TRUE;
wStatusDelay = 0;
}
else
{
SendIdentify(); //发送认证AC认证信息
FMTxStatus = IDENTIFY_STATUS;
FlagBuff1 |= IDENTIFY_ACK;
bTxCommand = TRUE;
wStatusDelay = 0;
}
}
//FlagBuff1 |= IDENTIFY_ACK;
break;
default:
break;
}
break;
default:
break;
}
break;
default:
break;
}
}
if(bTxCommand == TRUE) //复位初始化CP
{
switch(FMTxStatus)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -