Я просто пытаюсь научиться использовать внешний АЦП и ЦАП (PT8211) с моим PIC32MX534f06h.
До сих пор мой код просто собирал сигнал с моего АЦП каждый раз, когда срабатывает прерывание по таймеру, а затем отправлял этот же сигнал в ЦАП.Компоненты прерывания и АЦП работают нормально и были протестированы независимо, но напряжения, которые выводит мой ЦАП, не имеют для меня большого значения и остаются на уровне 2,5 В (он питается от 0 до 5 В).
IЯ пытался подать на ЦАП различные значения в диапазоне от 0 до 65534 (16-битный ЦАП, так что я предполагаю, что это должен быть ожидаемый диапазон значений для подачи на него, верно?), напряжение остается на уровне 2,5 В.
Я попытался изменить конфигурацию SPI, используя разные SPI (3 и 4) и ЦАП (у меня один припаян к моей печатной плате, припаян к SPI3 и один макет, связанный с SPI4 в случае, если одинспаянный на моей плате был неисправен).Я удостоверился, что линия выбора чипа работает как ожидалось.Я не мог видеть данные и часы, которые были переданы, так как у меня еще нет объема.
У меня немного не в порядке.
Выбор микросхемы и настройки конфигурации SPI
signed short adc_value;
signed short DAC_output_value;
int Empty_SPI3_buffer;
#define Chip_Select_DAC_Set() {LATDSET=_LATE_LATE0_MASK;}
#define Chip_Select_DAC_Clr() {LATDCLR=_LATE_LATE0_MASK;}
#define SPI4_CONF 0b1000010100100000 // SPI on, 16-bit master,CKE=1,CKP=0
#define SPI4_BAUD 100 // clock divider
Функция выхода ЦАП
//output to external DAC
void DAC_Output(signed int valueDAC) {
INTDisableInterrupts();
Chip_Select_DAC_Clr();
while(!SPI4STATbits.SPITBE); // wait for TX buffer to empty
SPI4BUF=valueDAC; // write byte to TX buffer
while(!SPI4STATbits.SPIRBF); // wait for RX buffer to fill
Empty_SPI3_buffer=SPI4BUF; // read RX buffer
Chip_Select_DAC_Set();
INTEnableInterrupts();
}
ISRвыборка данных, вызванная таймером1.Это отлично работает.ADC_input вводит данные в глобальную переменную adc_value (12 бит, со знаком)
//ISR to sample data
void __ISR( _TIMER_1_VECTOR, IPL7SRS) Test_data_sampling_in( void)
{
IFS0bits.T1IF = 0;
ADC_Input();
//rescale the signed 12 bit audio values to unsigned 16 bits wide values
DAC_output_value = adc_value + 2048; //first unsign the signed 12 bit values (between 0 - 4096, center 2048)
DAC_output_value = DAC_output_value *16; // the scale between 12 and 16 bits is actually 16=65536/4096
DAC_Output(DAC_output_value);
}
основная функция с SPI, IO, конфигурация таймера
void main() {
SPI4CON = SPI4_CONF;
SPI4BRG = SPI4_BAUD;
TRISE = 0b00100000;
TRISD = 0b000000110100;
TRISG = 0b0010000000;
LATD = 0x0;
SYSTEMConfigPerformance(80000000L); //
INTCONSET = _INTCON_MVEC_MASK; /* Set the interrupt controller for multi-vector mode */
//
T1CONbits.TON = 0; /* turn off Timer 1 */
T1CONbits.TCKPS = 0b11; /* pre-scale = 1:1 (T1CLKIN = 80MHz (?) ) */
PR1 = 1816; /* T1 period ~ ? */
TMR1 = 0; /* clear Timer 1 counter */
//
IPC1bits.T1IP = 7; /* Set Timer 1 interrupt priority to 7 */
IFS0bits.T1IF = 0; /* Reset the Timer 1 interrupt flag */
IEC0bits.T1IE = 1; /* Enable interrupts from Timer 1 */
T1CONbits.TON = 1; /* Enable Timer 1 peripheral */
INTEnableInterrupts();
while (1){
}
}
Я ожидаю увидеть напряжение навыходной сигнал моего ЦАП для имитации тех, которые я положил на вход моего АЦП, вместо этого выходное значение ЦАП всегда является постоянным, независимо от того, что я ввожу в АЦП
Чего мне не хватает?Кроме того, при включении SPI, я все еще должен вручную управлять конфигурацией IO выводов SDI SDO SCK, используя TRIS, или об этом автоматически заботятся?