Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Драйвер акселерометра LIS302DL (использует SPI1)
- ; Плата STM32F4-Discovery
- ; http://teplofizik.diary.ru/p179508680.htm
- ; Проверять выравнивание стека (8 байт)
- PRESERVE8
- AREA |.text|, CODE, READONLY
- EXPORT AccelInit
- EXPORT AccelX
- EXPORT AccelY
- EXPORT AccelZ
- EXPORT swi_AccelX
- EXPORT swi_AccelY
- EXPORT swi_AccelZ
- GET stm32f4xx.inc
- GET spi.inc
- GET lis302dl.inc
- READWRITE_CMD EQU 0x80 ; Read/Write command
- MULTIPLEBYTE_CMD EQU 0x40 ; Multiple byte read/write command
- DUMMY_BYTE EQU 0x00 ; Send by the SPI Master device in order to generate the Clock to the Slave device
- ; Запись регистра акселерометра
- ; Аргументы: 2
- ; R0: Адрес регистра
- ; R1: Данные для записи
- ; Результат: нет
- AccelWrite PROC
- PUSH {R4-R5,LR}
- MOV R4,R0 ; Адрес
- MOV R5,R1 ; Данные
- ; Выбрать устройство
- BL SpiSelect
- ; Отправка адреса
- MOV R0, R4
- BL SpiSend
- ; Отправка данных
- MOV R0, R5
- BL SpiSend
- ; Снять выбор...
- BL SpiDeselect
- POP {R4-R5,PC}
- ENDP
- ; Чтение регистра акселерометра
- ; Аргументы: 1
- ; R0: Адрес регистра
- ; Результат: прочитанный байт
- AccelRead PROC
- PUSH {R4,LR}
- MOV R4, R0
- ; Добавим к адресу флаг чтения
- ORR R4, #READWRITE_CMD
- ; Выбрать устройство
- BL SpiSelect
- ; Отправка адреса
- MOV R0, R4
- BL SpiSend
- ; Чтение байта (отправка пустого байта)
- MOV R0, #DUMMY_BYTE
- BL SpiSend
- ; Сохраним принятый байт
- MOV R4, R0
- ; Снять выбор...
- BL SpiDeselect
- ; Результат.
- MOV R0, R4
- POP {R4,PC}
- ENDP
- ; Прочитать ускорение по оси X
- ; Аргументы: нет
- ; Результат: ускорение по оси X (в пределах шкалы)
- swi_AccelX PROC
- PUSH {LR}
- MOV R0, #LIS302DL_OUT_X_ADDR
- BL AccelRead
- POP {PC}
- ENDP
- ; Прочитать ускорение по оси Y
- ; Аргументы: нет
- ; Результат: ускорение по оси Y (в пределах шкалы)
- swi_AccelY PROC
- PUSH {LR}
- MOV R0, #LIS302DL_OUT_Y_ADDR
- BL AccelRead
- POP {PC}
- ENDP
- ; Прочитать ускорение по оси Z
- ; Аргументы: нет
- ; Результат: ускорение по оси Z (в пределах шкалы)
- swi_AccelZ PROC
- PUSH {LR}
- MOV R0, #LIS302DL_OUT_Z_ADDR
- BL AccelRead
- POP {PC}
- ENDP
- ; Вызов через SVC
- AccelX PROC
- PUSH {LR}
- SVC 2
- POP {PC}
- ENDP
- AccelY PROC
- PUSH {LR}
- SVC 3
- POP {PC}
- ENDP
- AccelZ PROC
- PUSH {LR}
- SVC 4
- POP {PC}
- ENDP
- ; Инициализация драйвера (требует инициализированного SPI1)
- ; Аргументы: нет
- ; Результат: нет
- AccelInit PROC
- PUSH {LR}
- ; Проверка наличия акселерометра
- ; Должно прочитаться 0x3B
- MOV R0, #LIS302DL_WHO_AM_I_ADDR
- BL AccelRead
- CMP R0, #0x3B
- BNE __exit
- ; Настройка акселерометра (control register 1)
- MOV R0, #LIS302DL_CTRL_REG1_ADDR
- MOV R1, #0
- ORR R1, #LIS302DL_CTRL_REG1_DR ; Частота 400 Гц
- ; ORR R1, #LIS302DL_CTRL_REG1_FS ; Полная шкала
- ORR R1, #LIS302DL_CTRL_REG1_PD ; Активный режим
- ORR R1, #LIS302DL_CTRL_REG1_ZEN ; Включена ось Z
- ORR R1, #LIS302DL_CTRL_REG1_YEN ; Включена ось Y
- ORR R1, #LIS302DL_CTRL_REG1_XEN ; Включена ось X
- BL AccelWrite
- ; Настройка фильтрации
- ; MOV R0, #LIS302DL_CTRL_REG2_ADDR
- ; MOV R1, #0
- ; ORR R1, #LIS302DL_CTRL_REG2_FDS ; Результат - из фильтра
- ; ORR R1, #LIS302DL_CTRL_REG2_HP_COEFF1; Уровень: 0b11
- ; ORR R1, #LIS302DL_CTRL_REG2_HP_COEFF2; Уровень: 0b11
- BL AccelWrite
- __exit
- POP {PC}
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement