fm62429.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "includes.h"
  2. void FM_Init(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
  6. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //Disable jtag
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  8. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9. GPIO_InitStructure.GPIO_Pin = FM_CLK_PIN;
  10. GPIO_Init(FM_CLK_PORT, &GPIO_InitStructure);
  11. GPIO_InitStructure.GPIO_Pin = FM_SDA_PIN;
  12. GPIO_Init(FM_SDA_PORT, &GPIO_InitStructure);
  13. }
  14. ///////////////////////////////////////////////////////
  15. void FM_Dly(unsigned char timeDly)
  16. {
  17. unsigned short i;
  18. for(i=0;i<timeDly*50;i++)
  19. {
  20. __NOP();__NOP();
  21. }
  22. }
  23. void FM_Transmit(unsigned short data)
  24. {
  25. unsigned char i;
  26. FM_CLK(0);
  27. for(i=0;i<10;i++)
  28. {
  29. FM_SDA(data & 0x01);
  30. FM_Dly(4);//2
  31. FM_CLK(1);
  32. FM_Dly(4);
  33. FM_SDA(0);
  34. FM_Dly(4);
  35. FM_CLK(0);
  36. data >>= 1;
  37. }
  38. FM_Dly(4);
  39. FM_SDA(1);
  40. FM_Dly(4);
  41. FM_CLK(1);
  42. FM_Dly(4);
  43. FM_CLK(0);
  44. }
  45. void VolumeSave(void)
  46. {
  47. //SPIParaSave();
  48. }
  49. //volume: 低七位有效
  50. void FMSetVolume(unsigned char volume,char needSave)
  51. {
  52. unsigned char volTable[]={0,12,14,15,16,17,18,19,20,21};//10
  53. unsigned char ExvolTable[]={0,5,6,7,8,9,10,12,14,15,16};//4
  54. static unsigned char lastVolume=0xff;
  55. unsigned short transmitData,temp;
  56. unsigned char *p[10]={0};
  57. char buf[30];
  58. char i;
  59. sprintf(buf,"Vol:%d", volume);
  60. if(volume == VOLUME_MAX) strcat(buf, " Max");
  61. else if(volume == VOLUME_MIN) strcat(buf, " Min");
  62. //strcat(buf, "\r\n");
  63. SlwTrace(INF, buf,1);
  64. //if(lastVolume == volume) return;
  65. if(Headsetsta) {
  66. for(i=0;i<sizeof(volTable);i++)p[i]=&ExvolTable[i]; //有耳机
  67. }else{
  68. for(i=0;i<sizeof(volTable);i++)p[i]=&volTable[i]; //未插耳机
  69. }
  70. #if 1
  71. //0b---0xxc cttt ttkn
  72. //xx都固定为1
  73. //cc为通道2增益,这里随便
  74. //ttttt为通道1增益
  75. //k控制多少个通道 这里控制1个,即为1
  76. //n为通道选择 这里只选择通道1 即为0
  77. //printf("*(p[volume-1]==%d\r\n",*(p[volume]));
  78. transmitData=0x780;//0111 1000 0010 //2 0110 0000 0010
  79. //temp=volTable[volume-1]<<2;
  80. temp=(*(p[volume]))<<2;
  81. temp &= 0x7C;//0111 1100;//只取低5bits
  82. transmitData |= temp;
  83. FM_Transmit(transmitData);
  84. #else
  85. volume *= 2;
  86. transmitData =0;
  87. transmitData |= (1<<9) | (1<<10);//bit 9=1,bit10=1
  88. temp = volume & 0x7E;
  89. temp <<= 2;
  90. transmitData |= temp;
  91. transmitData |= (1>>7)|(1>>8);
  92. FM_Transmit(transmitData);
  93. #endif
  94. lastVolume = volume;
  95. if(needSave) VolumeSave();
  96. }
  97. void FMVolumeChange(VOLUME_DEF add_dicrease,char needSave)
  98. {
  99. // switch(add_dicrease)
  100. // {
  101. // case VOLUME_NORMAL:
  102. // sutSpiPara.volume = VOLUEM_DEFAULT;
  103. // break;
  104. // case VOLUME_RESTORE:
  105. // sutSpiPara.volume=sutSpiPara.volume;
  106. // break;
  107. // case VOLUME_ADD:
  108. // if(sutSpiPara.volume < VOLUME_MAX)
  109. // sutSpiPara.volume++;
  110. // break;
  111. // case VOLUME_DECREASE:
  112. // if(sutSpiPara.volume > VOLUME_MIN)
  113. // sutSpiPara.volume--;
  114. // break;
  115. // }
  116. // FMSetVolume(sutSpiPara.volume,needSave);
  117. }
  118. //void SaveCurrentVolume(void)
  119. //{
  120. // FMSetVolume(sutSpiPara.volume, 1);
  121. //}