Jump to content

    

andreichk

Свой
  • Content Count

    513
  • Joined

  • Last visited

Community Reputation

0 Обычный

About andreichk

  • Rank
    Знающий

Информация

  • Город
    Array

Recent Profile Visitors

3044 profile views
  1. SAI to SPI

    Вы были правы, косяк находился в инициализации SAI . После исправления, данные стали передаваться правильно. Большое спасибо всем участникам... вот собственно то, что должно получиться в итоге:
  2. SAI to SPI

    я все настройки кодека перепроверил. там всё как у других пользователей этого прибора. даже не представляю, куда ещё копать
  3. SAI to SPI

    я бы с удовольствием, но не знаю, как. а есть букварь для чайников на эту тему?
  4. SAI to SPI

    попробовал подменить тестовый буфер на реальные данные, полученные с кодека по SAI шине. #define NCHANNEL 2 #define NSAMPLE 512 #define NDUMM 32 typedef int16_t sample; typedef sample input_sample[NCHANNEL]; typedef input_sample audioBuf[NSAMPLE + NDUMM]; typedef sample output_channel[NSAMPLE]; typedef output_channel output_buffer[NCHANNEL]; audioBuf Input ; output_buffer Output; void shuffle(int channel) { for(int i = 0; i < NSAMPLE*2; ++i) Output[channel][i] = Input[i + NDUMM][channel]; } void DSP_Sample(void){ extern SAI_HandleTypeDef haudio_in_sai; HAL_StatusTypeDef res = HAL_SAI_Receive(&haudio_in_sai,(uint8_t*) Input, (NSAMPLE + NDUMM) * 2, HAL_MAX_DELAY); if (HAL_OK != res) { CRASH_(15,"HAL_SAI_Receive failed"); } for(int i = 0; i < NCHANNEL; ++i) {shuffle(i);} HAL_SPI_Transmit(&hspi3, (uint8_t*) &Output[0], (NSAMPLE + NDUMM) * 2, HAL_MAX_DELAY); } однако применительно к моему процессору,на выходе ничего не изменилось , то есть всё так и осталось , как с моим быдлокодом. разделения на левый и правый каналы к сож. не произошло.
  5. SAI to SPI

    увеличил кол-во данных в буфере и заполнение стало непрерывным. #define NCHANNEL 2 #define NSAMPLE 256 #define NDUMM 1 typedef int16_t sample; typedef sample input_sample[NCHANNEL]; typedef input_sample input_buffer[NSAMPLE + NDUMM]; typedef sample output_channel[NSAMPLE]; typedef output_channel output_buffer[NCHANNEL]; input_buffer Input = { 0,1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008, 1, 1008 }; output_buffer Output; void shuffle(int channel) { for(int i = 0; i < NSAMPLE*2; ++i) Output[channel][i] = Input[i + NDUMM][channel]; } void DSP_Sample(void){ extern SAI_HandleTypeDef haudio_in_sai; HAL_StatusTypeDef res = HAL_SAI_Receive(&haudio_in_sai,(uint8_t*) audioBuf, (NSAMPLE + NDUMMY) * 2, HAL_MAX_DELAY); if (HAL_OK != res) { CRASH_(15,"HAL_SAI_Receive failed"); } for(int i = 0; i < NCHANNEL; ++i) {shuffle(i);} HAL_SPI_Transmit(&hspi3, (uint8_t*) &Output[0], (NSAMPLE + NDUMM) * 2, HAL_MAX_DELAY); } на картинке видно, что данные с буфера уложились правильно
  6. SAI to SPI

    спасибо всем отозвавшимся, я проверил все ваши поправки и вот что получил, только я немного увеличил размер тестового буфера, чтобы приблизить к реальным условиям. #define NCHANNEL 2 #define NSAMPLE 256 #define NDUMM 1 typedef int16_t sample; typedef sample input_sample[NCHANNEL]; typedef input_sample input_buffer[NSAMPLE + NDUMM]; typedef sample output_channel[NSAMPLE]; typedef output_channel output_buffer[NCHANNEL]; input_buffer Input = { 0,1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31, 1008, 31 }; output_buffer Output; void shuffle(int channel) { for(int i = 0; i < NSAMPLE; ++i) Output[!channel][i] = Input[i + NDUMM][channel]; } void DSP_Sample(void){ // extern SAI_HandleTypeDef haudio_in_sai; // HAL_StatusTypeDef res = // HAL_SAI_Receive(&haudio_in_sai,(uint8_t*) audioBuf, (NSAMPLE + NDUMMY) * 2, HAL_MAX_DELAY); // if (HAL_OK != res) // { // CRASH_(15,"HAL_SAI_Receive failed"); // } for(int i = 0; i < NCHANNEL; ++i) shuffle(i); HAL_SPI_Transmit(&hspi3, (uint8_t*) &Output[0], (NSAMPLE + NDUMM) * 2, HAL_MAX_DELAY); } однако , применительно к конкретному процессору STM32H743, получилось не совсем то, что ожидалось, а именно как на картинке. наверное потому что данных в буфере в 2 раза меньше
  7. SAI to SPI

    Привет народ. Необходимо переслать по СПИ шине данные , полученные со звукового кодека, который подключен по SAI в другой процессор. Судя по осциллограмме на ножках кодека, инициализация проходит успешно и можно видеть , как данные от левого и правого каналов меняются независимо друг от друга( проверял с помощью подачи синуса на каждый канал). То есть данные передаются в буфер в порядке 16 бит левого канала, затем 16 бит правого канала и т.д. то есть как в даташите прописано. Пытаюсь для передачи по СПИ перетасовать данные в порядок 512 байт левого канала, затем 512 байт правого канала таким кодом: #define NSAMPLES 512 //Must be order of 2 #define NDUMMY 32 //Dummy samples are needed to minimize influence of filter settling after invoking the SAI int16_t audioBuf[(NSAMPLES + NDUMMY) * 2]; int16_t audioBuff[(NSAMPLES + NDUMMY) * 2];// void DSP_Sample_send(int ch){ int16_t* pBuf = &audioBuf[NDUMMY + (ch!=0)]; for(int i = 0; i < NSAMPLES; i++) { if (ch!=0) audioBuff[i] = (int16_t)*pBuf; else audioBuff[ NSAMPLES + i ] = (int16_t)*pBuf; pBuf += 2; } pBuf = 0; } void DSP_Sample(void){ extern SAI_HandleTypeDef haudio_in_sai; HAL_StatusTypeDef res = HAL_SAI_Receive(&haudio_in_sai,(uint8_t*) audioBuf, (NSAMPLES + NDUMMY) * 2, HAL_MAX_DELAY); if (HAL_OK != res) { CRASH_(15,"HAL_SAI_Receive failed"); } DSP_Sample_send(0); //заполняем 512байт левый канал DSP_Sample_send(1);//заполняем 512байт правый канал HAL_SPI_Transmit(&hspi3, (uint8_t*) audioBuff, (NSAMPLES + NDUMMY) * 2, HAL_MAX_DELAY); } однако на ножке MOSI вижу, что данные левого и правого канала идентичны, то есть меняются одновременно от одного из каналов на входе кодека, а от другого не меняются вовсе, хотя на самом кодеке, как я писал выше, видно чёткое разделение данных левого и правого каналов. Подскажите битте, где я косячу и помогите исправить ошибки. Спасибо заранее...
  8. а халявная лицензия к ней прилагается?
  9. вобщем мы подумали и я решил: выкинуть УАРТ и выводить команды прямо в паралельный порт, с которого адресо-командо байты передаются в СПИ модуль в спартане. выглядит это так: код в микроблейзе: //================================================================================ = // //================================================================================ = #include <pthread.h> #include <stdio.h> #include "platform.h" #include <xparameters.h> #include <xiomodule.h> #include <xiomodule_l.h> XIOModule gpo1; volatile u16 addr_command[]= { 0x0002,// RESET 0x0001,// READOUT ENABLE 0x0300,// HIGH PERF MODE 0x4101,// LVDS/ КАНАЛ "В" ОТКЛЮЧЕН 0x4208,// EN DIGITAL 0x4500,// LVDS STRENG 0x4A00,// HIGH FREQ MODE CH B 0x5800,// HIGH FREQ MODE CH A 0x2504,// CH A TEST PATTERNS 0x2B04,// CH B TEST PATTERNS 0x2BC0,// CH B Normal mode 0x25C0,// CH A Normal mode 0x3D20,// ENABLE OFFSET CORR 0xCFBC,// FREEZE OFFSET CORR, OFFSET CORR TIME CONSTANT 0x2900,// DATA FORMAT Twos complement 0x4200 //, // DIS DIGITAL //0x0000 // }; volatile u32 ct = 0; void delay(u32 ms) { ct = 0; // set the counter to 0 while (ct++ < ms); // wait for ms number of milliseconds } int main() { XIOModule_Initialize(&gpo1, XPAR_IOMODULE_0_DEVICE_ID); XIOModule_Start(&gpo1); volatile int i = 0; for (i = 0; i < 16; ++i) { XIOModule_DiscreteWrite(&gpo1, 1, addr_command[i]);// отправка команд в АЦП delay(2); } return 0; } и приёмник в спартане: `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Create Date: 26/03/2018 // Module Name: SPI_Master // SPI интерфейс для ADS4245 // Serial Data Input. This device has a 16-bit shift register. ////////////////////////////////////////////////////////////////////////////////// module SPI_Master16( input clk, input [15:0]IN_Data, output reg CS, output reg SDATA, output reg SCLK ); reg [5:0] cnt; reg [9:0] DataRate; reg [4:0] ByteCaunt; reg [15:0] DataINReg; //------------------------------------------------ //Формирования тактовых импульсов и последовательных данных always @(posedge clk) begin if (CS == 0) begin cnt = cnt + 1'b1; if (cnt == 12) begin SCLK = 0; SDATA = DataINReg [15 - ByteCaunt]; end if (cnt == 24) begin ByteCaunt = ByteCaunt + 1'b1; SCLK = 1; cnt = 0; end end else begin SCLK = 1; cnt = 0; ByteCaunt =0; SDATA = 0; end end //----------------------------------------------- //----------------------------------------------- // Формирование частоты обновления и чип селекта // 120.88 МГц тактовые импульсы // Поступающие данные 5 MГц always @(posedge clk) begin DataRate = DataRate + 1'b1; if (DataRate == 256) begin CS = 0; end if (DataRate == 640) begin CS = 1; DataRate = 0; end end //----------------------------------------------- always @(posedge clk) begin DataINReg = IN_Data; end endmodule //=============================================================================== //--------------------- ВСТРОЕННЫЙ ПРОЦЕССОР MICROBLAZE ------------------------ //=============================================================================== wire [15:0]GPO1; reg [15:0]data16; wire ADS_CS, ADS_SDATA, ADS_SCLK; microblaze_mcs_v1_4 mcs_0 ( .Clk(res_clkA), // input clk .Reset(resetS0), // input Reset .GPO1(GPO1[15:0]) // output [15 : 0] GPO1 ); //=============================================================================== //--------------------- ИНИЦИАЛИЗАЦИЯ И КАЛИБРОВКА ADS4245 ---------------------- //=============================================================================== SPI_Master16 ADS4245( .clk(res_clkA), // .IN_Data(GPO1[15:0]),//входные данные 16bit .CS(ADS_CS), .SDATA(ADS_SDATA), .SCLK(ADS_SCLK) ); assign RESET = GPO1[1]; //"C14" '0' для управления по СПИ assign SCLK = ADS_SCLK; //"D15" assign SDATA = ADS_SDATA;//"C16" assign SEN = ADS_CS; //"D17" //================================================================================ = получилась вот такая картинка. вобщем , что посылаю, то и получаю.....
  10. // HIGH PERF MODE xil_printf("%b", 0x03, 0x00 ); // LVDS CMOS xil_printf("%b", 0x41, 0x00); // EN DIGITAL xil_printf("%d", 0x42, 0x08); // LVDS STRENG xil_printf("%b", 0x45, 0x00); // HIGH FREQ MODE CH B xil_printf("%b", 0x4A, 0x00); // HIGH FREQ MODE CH A xil_printf("%b", 0x58, 0x00); // CH A/B TEST PATTERNS xil_printf("%b", 0x25, 0x04); xil_printf("%b", 0x2B, 0x04); // Start calibration /// devmem 0x43C20044 32 0x00000100 непонятно как это описать? delay(2); // delay one second sleep 2 ///ADC_DONE_STATUS=$((`devmem 0x43C20010` & 0x00000003)) непонятно как это описать? if( inbyte()== 3 )//читаем ответ if [[ $ADC_DONE_STATUS -eq 3 ]] xil_printf("Calibration Done"); else xil_printf("Calibration Failed"); ///fi непонятно как это описать? // Stop calibration ///devmem 0x43C20044 32 0x00000000 непонятно как это описать? // CH A/B Normal mode xil_printf("%b", 0x25, 0xC0); xil_printf("%b", 0x2B, 0x00); подключил микроблейз к спартану. Поморгал светодиодами и инициализировал УАРТ. Проверил осциллографом пины УАРТА, Точно вижу, что шлёт указанные байты. Но остались непонятки с синтаксисом. Кто подстажет, как это описать на Си в микроблейзе? Спасибо заранее....
  11. Привет народ, кто может помочь дописать модуль на верилоге для инициализации ADC4245 по заданному описанию? предполагаю, что начало должно выглядеть так: `timescale 1ms / 1ns ////////////////////////////////////////////////////////////////////////////////// // Module Name: adc_spi настройка ацп по спи ////////////////////////////////////////////////////////////////////////////////// module adc_spi_init( // Clock input wire clock, input wire init_en, // ADC Out output reg adc_sload, output wire adc_sclk, output reg adc_sdata ); reg [7:0]HIGH_PERF_MODE = 8'h03 & 8'h00; // HIGH_PERF_MODE reg [7:0]LVDS_CMOS = 8'h41 & 8'h00; // LVDS_CMOS reg [7:0]EN_DIGITAL = 8'h42 & 8'h08; // EN_DIGITAL reg [7:0]LVDS_STRENG = 8'h45 & 8'h00; // LVDS_STRENG reg [7:0]HIGH_FREQ_MODE_CH_B = 8'h4A & 8'h00; // HIGH_FREQ_MODE_CH_B reg [7:0]HIGH_FREQ_MODE_CH_A = 8'h58 & 8'h00; // HIGH_FREQ_MODE_CH_A reg [7:0]CH_A_TEST_PATTERNS = 8'h25 & 8'h04; // CH_A_TEST_PATTERNS reg [7:0]CH_B_TEST_PATTERNS = 8'h2B & 8'h04; // CH_B_TEST_PATTERNS always @ ( posedge clock ) begin .......................................... end endmodule Приветствуется любая помощь. Заранее спасибо...
  12. спасибо, я этот код видел, СИСы можно оттуда выдернуть, а ФИРы заточены под циклоновские корки, на хилинкс не ложатся.
  13. конечная цель - сканер КВ-диапазона. конкретно по фильтрам: как я понимаю, согласно общей теории построения СДР приёмников , после СИС фильтра, должен следовать ФИР, который тоже должен децимировать входную частоту. Как я уже указывал, на выходе смесителя у меня при тактовой 120.88 МГц должно выходить от 0 до 60 МГц, то есть в КВ диапазон как раз попадаем. тогда, если я хочу напр. чтобы на выходе ФИР у меня было ну скажем 118 кГц, то я должен весь сигнал поделить на 1024, раскидав делители на все фильтры, правильно?
  14. Ок, начнём конкретно. 1. фильтр CIC. на входе имеем 20 бит со смесителя. Как я уже писал, общая тактовая частота 120.88 МГц. В настройках есть такой параметр Sample rate. Если выставлю его == 12, то на выходе фильтра будет поток примерно 12 МГц, так? Далее за CIC фильтром идёт набор FIR, и в них тоже есть опция установки Input Sample rate. Как их правильно выставлять? в соответствии с делителем предыдущего значения? То есть , если первый СИС делит на 12, то тогда в ФИР ставим 12Мгц , в следующем ФИР децимация == 8, тогда делим 12 на 8, для следующего так же делим значение предыдущего и т.д ? вобщем сделал так: CIC децимация на 32 далее все остальные ФИРы децимация на 2, соответственно параметры Input Sample rate такие: 3.7775 1.88875 0.944375 0.4721875 0.23609375 0.118046875 то есть самый последний ФИР выдаёт поток 118 кГц, который я уже в квадратурном смесителе обрабатываю. Тогда такой вопрос: все фильтры тактируются одной частотой 120.88 Мгц. Может для ФИРов тоже можно\нужно тактовую частоту понижать, чтобы лучше фильтровало?
  15. ну это пока. вы поможете мне фильтры настроить?