Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Разное » FM передатчик QN8027


FM передатчик QN8027

Сообщений 1 страница 10 из 10

1

Приветствую! Снова прошу у вас помощи знатоки Bascom'а. Купил на aliexpress микросхемы QN8027,управляется по шине I2C. С командами разобрался все работает, кроме передачи RDS. Вроде прописал все согласно даташиту, но увы данные не идут, даже значек рдс не загорается на приемнике. Проверьте пожалуйста,что я делаю не так?
Даташит на микросхему. даташит
Сам код:

Код:
$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600

Config Sda = Portc.4
Config Scl = Portc.3

Const Qn8027w = &H58
Const Qn8027r = &H59

Dim A As Byte

Wait 2


I2cstart                                                    'Settings & TX frequency
I2cwbyte Qn8027w
I2cwbyte &H00
I2cwbyte &B00100110                                         'settings,MB of TX frequency
I2cwbyte &B01000100                                         'LB of TX frequency
I2cwbyte &B00111010                                         'Pre-emphasis = 50us,Privacy mode = 0,PA off when no audio = 0
I2cstop

I2cstart                                                    'RDSD0-7
I2cwbyte Qn8027w
I2cwbyte &H08
I2cwbyte 77                                                 'M
I2cwbyte 121                                                'y
I2cwbyte 32                                                 '
I2cwbyte 82                                                 'R
I2cwbyte 97                                                 'a
I2cwbyte 100                                                'd
I2cwbyte 105                                                'i
I2cwbyte 111                                                'o
I2cstop

I2cstart                                                    'TX frequency deviation
I2cwbyte Qn8027w
I2cwbyte &H11
I2cwbyte &B10000001                                         '75kHz
I2cstop

I2cstart                                                    'Rds enable & rds frequency deviation
I2cwbyte Qn8027w
I2cwbyte &H12
I2cwbyte &B10001111
I2cstop

Do
!nop
Loop

0

2

Вроде бы вначале надо инициализировать RDS адресом #12h (и возможно другими, всё описание не читал), а потом уже пытаться в него что-то пихать, не?

0

3

Попробовал так,вначале разрешаем передачу RDS и выставляем девиацию 2кГц для RDS по адресу 12h,потом чтобы чип принял наши данные переключаем бит RDSRDY на 1 по адресу 00h и отправляем в чип 8 байт данных по адресам 08h-0Fh. Все равно не работает. Даже микросхему поменял на другую.

0

4

Вот тут на "китайском", есть описания кода на си, может поможет по части рдс: http://www.taodocs.com/p-1796421.html

0

5

Этот документ я уже видел,код для приемника на микросхеме QN8035.

0

6

Сегодня поменял кварц на 12МГц, и о чудо значек рдс на приемнике появился,но пока текст так и не появился. Мучения микросхемы и мои продолжаются.

0

7

RDS заработал,надо было всего-то прочитать стандарт передачи данных RDS. Вот рабочий код для QN8027 с передачей группы 0А(PI,PTY,TP,TA,DI,2xAF,M/S,PS - название станции). Можно таким же образом передавать любую группу. Частота 105.0 МГц.

Код:
$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600

Config Sda = Portc.4
Config Scl = Portc.3

Const Qn8027w = &H58
Const Qn8027r = &H59

Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte

Dim Ps1 As String * 1
Dim Ps2 As String * 1
Dim Ps3 As String * 1
Dim Ps4 As String * 1
Dim Ps5 As String * 1
Dim Ps6 As String * 1
Dim Ps7 As String * 1
Dim Ps8 As String * 1
Dim Ps As String * 8

Dim 1ps As Byte
Dim 2ps As Byte
Dim 3ps As Byte
Dim 4ps As Byte
Dim 5ps As Byte
Dim 6ps As Byte
Dim 7ps As Byte
Dim 8ps As Byte

I2cstart                                                    'Reset QN8027
I2cwbyte Qn8027w
I2cwbyte &H00
I2cwbyte &B1100000
I2cstop

Waitms 250

I2cstart                                                    'TX frequency deviation
I2cwbyte Qn8027w
I2cwbyte &H11
I2cwbyte &B10000001                                         '75kHz
I2cstop

I2cstart                                                    'Rds enable & rds frequency deviation
I2cwbyte Qn8027w
I2cwbyte &H12
I2cwbyte &B10000110
I2cstop

Waitms 250

I2cstart                                                    'Settings & TX frequency
I2cwbyte Qn8027w
I2cwbyte &H00
I2cwbyte &B00100010                                         'settings,MB of TX frequency
I2cwbyte &B01000100                                         'LB of TX frequency
I2cwbyte &B00111001                                         'Pre-emphasis = 50us,Privacy mode = 0,PA off when no audio = 0
I2cwbyte &B00010000
I2cwbyte &B00110010
I2cstop

D = 0

Ps = "My Radio"

Ps1 = Mid(ps , 1 , 1)
Ps2 = Mid(ps , 2 , 1)
Ps3 = Mid(ps , 3 , 1)
Ps4 = Mid(ps , 4 , 1)
Ps5 = Mid(ps , 5 , 1)
Ps6 = Mid(ps , 6 , 1)
Ps7 = Mid(ps , 7 , 1)
Ps8 = Mid(ps , 8 , 1)

1ps = Asc(ps1)
2ps = Asc(ps2)
3ps = Asc(ps3)
4ps = Asc(ps4)
5ps = Asc(ps5)
6ps = Asc(ps6)
7ps = Asc(ps7)
8ps = Asc(ps8)

Do

Waitms 20

I2cstart
I2cwbyte Qn8027w
I2cwbyte &H00
I2cwbyte &B00100110                                         'RDSRDY = 1
I2cstop

Waitms 20

I2cstart
I2cwbyte Qn8027w
I2cwbyte &H07
I2cstart
I2cwbyte Qn8027r
I2crbyte C , Nack
I2cstop

If C.5 = 1 Then

Incr D

If D = 1 Then
I2cstart                                                    'RDSD0-7
I2cwbyte Qn8027w
I2cwbyte &H08
I2cwbyte &B01110000                                         'PI
I2cwbyte &B11111111                                         'PI
I2cwbyte &B00000001                                         'group type 4bit,A=0 B=1,TP,PTY 5 bit
I2cwbyte &B01110100                                         'ta,ms,di,cc
I2cwbyte &B00000000                                         'af not used
I2cwbyte &B00000000                                         'af not used
I2cwbyte 1ps
I2cwbyte 2ps
I2cstop
End If

If D = 2 Then
I2cstart                                                    'RDSD0-7
I2cwbyte Qn8027w
I2cwbyte &H08
I2cwbyte &B01110000                                         'PI
I2cwbyte &B11111111                                         'PI
I2cwbyte &B00000101                                         'group type 4bit,A=0 B=1,TP,PTY 5 bit
I2cwbyte &B01110001                                         'ta,ms,di,cc
I2cwbyte &B00000000                                         'af not used
I2cwbyte &B00000000                                         'af not used
I2cwbyte 3ps
I2cwbyte 4ps
I2cstop
End If

If D = 3 Then
I2cstart                                                    'RDSD0-7
I2cwbyte Qn8027w
I2cwbyte &H08
I2cwbyte &B01110000                                         'PI
I2cwbyte &B11111111                                         'PI
I2cwbyte &B00000110                                         'group type 4bit,A=0 B=1,TP,PTY 5 bit
I2cwbyte &B01110010                                         'ta,ms,di,cc
I2cwbyte &B00000000                                         'af not used
I2cwbyte &B00000000                                         'af not used
I2cwbyte 5ps
I2cwbyte 6ps
I2cstop
End If

If D = 4 Then
I2cstart                                                    'RDSD0-7
I2cwbyte Qn8027w
I2cwbyte &H08
I2cwbyte &B01110000                                         'PI
I2cwbyte &B11111111                                         'PI
I2cwbyte &B00000110                                         'group type 4bit,A=0 B=1,TP,PTY 5 bit
I2cwbyte &B01110111                                         'ta,ms,di,cc
I2cwbyte &B00000000                                         'af not used
I2cwbyte &B00000000                                         'af not used
I2cwbyte 7ps
I2cwbyte 8ps
I2cstop
D = 0
End If

Waitms 20

I2cstart
I2cwbyte Qn8027w
I2cwbyte &H00
I2cwbyte &B00100010                                         'RDSRDY = 0
I2cstop

End If

Loop

Отредактировано Airat (2014-01-26 15:38:33)

0

8

Airat
Приветствую!

у меня есть вопросы по коду, будет здорово, если поясните некоторые моменты:
1. в третьем от начала вызове I2cwbyte() передаётся 7битный аргумент.. - опечатка?
2. If C.5 = 1 Then - проверка 5го бита регистра статуса?.. но 5й бит  - это один из AUD_PEAK[], быть может тут подразумевается RDS_UPD - но это 3й бит...
3. не очень улавливаю для чего передаётся динамический PTY - т.е. для чего вообще это нужно и как приёмником используется???

Из описания регистров (даташит) не очень уловил логику работы с RDS_RDY и RDS_UPD, которая прослеживается из вашего кода,
у вас есть имеется какой-то апп-ноут помимо даташита?

Спасибо!

Отредактировано rfcat (2014-02-06 16:07:30)

0

9

Вот елки палки,по ошибке не тот код выложил. rfcat, вы правы для сброса надо передать &B11000000. И конечно же надо проверять третий бит. Для того чтобы передать группу RDS надо переключить бит RDS_RDY на 1 и начинаем проверять бит RDS_UPD, когда он поменяет свое значение,загружаем 8 байт RDSD0-7 и переключаем бит RDS_RDY на 0. А по поводу PTY,я просто проверял работу флагов DI. К сожалению кроме даташита у меня ничего нет,да и то приходилось методом тыка некоторые вещи делать. И еще используйте кварц на 12МГц, т.к. с кварцем на 24МГц RDS так и не заработал. А в целом микросхема не так уж и плоха,если учитывать что она стоит ~15 рублей.

0

10

Airat Дай пожалуйста рабочий код ели можешь, не могу правильно сформировать данные для рдс. Помоги если тебе таки удалось запустить текст на приемник! Вот мой код.

Код:
void main(){
char  rdsText[] = "My Radio";
short count = 0;

//резет
      startI2c();
      writeI2c(QN8027_Writte);
      writeI2c(0b00000000);            //00h
      writeI2c(0b11000000);            //00h
      stopI2c();

      Delay_ms(500);

      startI2c();
      writeI2c(QN8027_Writte);
      writeI2c(0b00000000);            //00h
      
      writeI2c(0b11000000);            //00h
      writeI2c(0b11110000);             //01h
      writeI2c(0b00111001);              //02h
      writeI2c(0b00111111);                //03h
      writeI2c(0b00110010);                 //04h
      stopI2c();

      
      startI2c();
      writeI2c(QN8027_Writte);
      writeI2c(0x10);            //00h
      writeI2c(0b01111111);                   //10h
      writeI2c(0b10000001);                   //11h
      writeI2c(0b10000110);                   //12h
      stopI2c();


           
     while(1){
          char this_status = 0;


           startI2c();
           writeI2c(QN8027_Writte);
           writeI2c(0b00000000);            //00h
           writeI2c(0b00100100);            //00h                RDSRDY = 1
           stopI2c();


            while(this_status.F3 == 0){
                startI2c();
                writeI2c(QN8027_Writte);
                writeI2c(0x07);
                stopI2c();
                
                startI2c();
                writeI2c(QN8027_Read);
                this_status = readI2c();
              //  GPIO.F2 = this_status.F3;
                stopI2c();
            }
            this_status = 0;

      switch(count++){


       case 0 :
            startI2c();
            writeI2c(QN8027_Writte);
            writeI2c(0x08);
            
            writeI2c(PI_H);                   
            writeI2c(PI_L);                 
            
            writeI2c(0b10100000);                   
            writeI2c(0b00000000);                  
            
            writeI2c(rdsText[7]);                 
            writeI2c(rdsText[6]);               
            
            writeI2c(rdsText[5]);                 
            writeI2c(rdsText[4]);              
            stopI2c();
            break;



     case 1 :
            startI2c();
            writeI2c(QN8027_Writte);
            writeI2c(0x08);
            
            writeI2c(PI_H);                
            writeI2c(PI_L);                  
            
            writeI2c(0b10100000);                 
            writeI2c(0b00000001);                
            
            writeI2c(rdsText[3]);               
            writeI2c(rdsText[2]);               
            
            writeI2c(rdsText[1]);            
            writeI2c(rdsText[0]);           
            stopI2c();

            count = 0;
            break;

      }
          //   GPIO.F2 = 0;

           startI2c();
           writeI2c(QN8027_Writte);
           writeI2c(0b00000000);       
           writeI2c(0b00100000);            //00h                RDSRDY = 0       
           stopI2c();

           Delay_ms(10);
         }

}

Отредактировано Balliil (2015-01-20 14:54:38)

0


Вы здесь » Программирование ATMEL в BASCOM. » Разное » FM передатчик QN8027