реклама на сайте
подробности

 
 
> AT91SAM7S работа ADC совместно с PDC (прямой доступ к памяти)
kumle
сообщение Dec 7 2011, 12:17
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Очень плохо этот момент описан в даташите и примера в IAR как назло нет.
Пробовал сам сделать но не получилось. Может там есть какая то хитрость ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
RabidRabbit
сообщение Dec 7 2011, 17:49
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Вот мой примерчик, правда, использованные константы не раскрыты - но на то есть даташит sm.gif
Сигнал запуска преобразования генерит TC0, есть два буфера, после заполнения одного из
буферов дёргается прерывание, в котором заполненный буфер копируется "во вне" и подставляется
в качестве "следующего". На всякий случай скажу, что PDC при работе с ADC считает переданные отсчёты, а не байты.

Настройка ADC
CODE

;
; adc.s - ADC setup and isr
;

INCLUDE common.inc

AREA TEXT, CODE, READONLY
ARM

EXPORT initAdc
EXPORT adcTargetBuffer

initAdc
; здесь надо очистить все буферы и проинициализировать переменные!!!
ldr r0, =adcTargetBuffer
ldr r1, =0
ldr r2, =ADC_BUFFER_COUNT
initAdd_clearLoop
str r1, [r0], #4
subs r2, #1
bne initAdd_clearLoop
; обнулим переключатель буферов
add r2, r0, #(adcBufferFlipFlop - adcTargetBuffer)
str r1, [r2]
; настройка
ldr r0, =ADC_BASE
; setup PDC
ldr r1, =adcFirstBuffer
str r1, [r0, #PDC_RPR]
ldr r1, =adcSecondBuffer
str r1, [r0, #PDC_RNPR]
ldr r1, =ADC_BUFFER_COUNT
str r1, [r0, #PDC_RCR]
str r1, [r0, #PDC_RNCR]
ldr r1, =1 ; RXTEN
str r1, [r0, #PDC_PTCR]
; настроим АЦП
; опорная частота АЦП = 55000000 / ( ( 10 + 1 ) * 2 ) = 2500000 Гц
; время SHTIM = 3 / 2500000 = 1.2 мкс
ldr r1, =0x04170A01 ; триггер по сигналу TIOA0
str r1, [r0, #ADC_MR]
ldr r1, =0xFF
str r1, [r0, #ADC_CHDR]
ldr r1, =(1 << 4)
str r1, [r0, #ADC_CHER]
; enable interrupt for buffer full event
ldr r1, =0x00040000
str r1, [r0, #ADC_IER]
; настроим AIC
ldr r0, =AIC_BASE
ldr r1, =0x00000006
str r1, [r0, #AIC_SMR4]
ldr r1, =adcBufferReaded
str r1, [r0, #AIC_SVR4]
ldr r1, =(1 << 4)
str r1, [r0, #AIC_IECR] ; включаем прерывание от АЦП
; выход
bx LR


; обработчик прерывания от АЦП
adcBufferReaded
stmfd SP!, {r0-r5,r7,r8,LR}
; меняем буфер
ldr r0, =adcFirstBuffer
ldr r7, [r0, #(adcBufferFlipFlop - adcFirstBuffer)]
tst r7, #1
add r7, #1
str r7, [r0, #(adcBufferFlipFlop - adcFirstBuffer)]
; адрес прочитанного буфера помещаем в PDC_RNCR
moveq r8, r0
addne r8, r0, #(adcSecondBuffer - adcFirstBuffer)
ldr r4, =ADC_BASE
str r8, [r4, #PDC_RNPR]
ldr r2, =ADC_BUFFER_COUNT
str r2, [r4, #PDC_RNCR]
; вхреначиваем считанные данные в накопительный буфер
add r5, r0, #(adcTargetBuffer - adcFirstBuffer)
ldr r2, =ADC_BUFFER_COUNT / 8
adcBufferReaded_addToAcc
ldmia r8!, {r1,r3,r4,r7}
stmia r5!, {r1,r3,r4,r7}
subs r2, #1
bne adcBufferReaded_addToAcc
; выход из прерывания
adcBufferReaded_exit
ldr r0, =ADC_BASE
ldr r1, [r0, #ADC_SR]
ldr r0, =AIC_BASE
ldr r1, =(1 << 4)
str r1, [r0, #AIC_EOICR]
ldmfd SP!, {r0-r5,r7,r8,LR}
subs PC, LR, #4



AREA ZDATA, NOINIT, READWRITE

adcFirstBuffer
SPACE ADC_BUFFER_COUNT * 2 ; 10 bits ADC, 2 bytes - one shot
adcSecondBuffer
SPACE ADC_BUFFER_COUNT * 2
adcTargetBuffer
SPACE ADC_BUFFER_COUNT * 2 ; buffer visible for main task
EXPORT adcBufferFlipFlop
adcBufferFlipFlop
SPACE 4 ; флаг переключения буферов и счётчик циклов


END


Настройка таймера TC0 (на TC1 и TC2 внимания не обращать) для пинания ADC:
CODE

; enable clock for TC0, TC1 and TC2
ldr r2, =PMC_BASE
ldr r1, =((1 << 12) + (1 << 13) + (1 << 14))
str r1, [r2, #PMC_PCER]
;
ldr r0, =TC_BASE
ldr r1, =0x00000015
str r1, [r0, #TC_BMR]
; setup TC0 - ADC trigger timer, по CPA сигнал TIOA0 поднимаем, по CPC - бросаем
ldr r1, =0x0009C400
str r1, [r0, #TC0_CMR]
ldr r1, =275
str r1, [r0, #TC0_RC]
ldr r1, =139
str r1, [r0, #TC0_RA]
; setup TC1 - pulse make timer
ldr r1, =0x8343E400
str r1, [r0, #TC1_CMR]
ldr r1, =550 ; 0x01F4
str r1, [r0, #TC1_RC]
ldr r1, =274 ; (RC / 2) - 1
str r1, [r0, #TC1_RB]
add r1, r1, #2
str r1, [r0, #TC1_RA]
; setup TC2 - tracking timer
ldr r1, =0x0000C400
str r1, [r0, #TC2_CMR]
ldr r1, =1100 ; 550 * 2
str r1, [r0, #TC2_RC]
; enable interrupt from TC2 RC compare event
ldr r1, =0x00000010
str r1, [r0, #TC2_IER]
; enable clock for TC0, TC1 and TC2
ldr r1, =0x00000001
str r1, [r0, #TC0_CCR]
str r1, [r0, #TC1_CCR]
str r1, [r0, #TC2_CCR]
; start clock for all TCs
ldr r1, =0x00000001 ; SYNC
str r1, [r0, #TC_BCR] ; start count


Сообщение отредактировал RabidRabbit - Dec 7 2011, 17:53
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 03:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.0136 секунд с 7
ELECTRONIX ©2004-2016