Advertisement
teplofizik

accel.s (7)

Aug 9th, 2012
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Драйвер акселерометра LIS302DL (использует SPI1)
  2. ; Плата STM32F4-Discovery
  3. ; http://teplofizik.diary.ru/p179508680.htm
  4.  
  5.     ; Проверять выравнивание стека (8 байт)
  6.     PRESERVE8
  7.    
  8.     AREA    |.text|, CODE, READONLY
  9.  
  10.             EXPORT AccelInit
  11.             EXPORT AccelX
  12.             EXPORT AccelY
  13.             EXPORT AccelZ
  14.  
  15.             EXPORT swi_AccelX
  16.             EXPORT swi_AccelY
  17.             EXPORT swi_AccelZ
  18.  
  19.             GET stm32f4xx.inc
  20.             GET spi.inc
  21.             GET lis302dl.inc
  22.            
  23. READWRITE_CMD              EQU 0x80 ; Read/Write command
  24. MULTIPLEBYTE_CMD           EQU 0x40 ; Multiple byte read/write command
  25. DUMMY_BYTE                 EQU 0x00 ; Send by the SPI Master device in order to generate the Clock to the Slave device
  26.  
  27. ; Запись регистра акселерометра
  28. ; Аргументы: 2
  29. ;  R0: Адрес регистра
  30. ;  R1: Данные для записи
  31. ; Результат: нет  
  32. AccelWrite  PROC
  33.             PUSH {R4-R5,LR}
  34.             MOV   R4,R0 ; Адрес
  35.             MOV   R5,R1 ; Данные
  36.            
  37.             ; Выбрать устройство
  38.             BL    SpiSelect
  39.            
  40.             ; Отправка адреса
  41.             MOV   R0, R4
  42.             BL    SpiSend
  43.            
  44.             ; Отправка данных
  45.             MOV   R0, R5
  46.             BL    SpiSend
  47.            
  48.             ; Снять выбор...
  49.             BL    SpiDeselect
  50.            
  51.             POP  {R4-R5,PC}
  52.             ENDP
  53.  
  54. ; Чтение регистра акселерометра
  55. ; Аргументы: 1
  56. ;  R0: Адрес регистра
  57. ; Результат: прочитанный байт  
  58. AccelRead   PROC
  59.             PUSH {R4,LR}
  60.             MOV   R4, R0
  61.            
  62.             ; Добавим к адресу флаг чтения
  63.             ORR   R4, #READWRITE_CMD
  64.            
  65.             ; Выбрать устройство
  66.             BL    SpiSelect
  67.            
  68.             ; Отправка адреса
  69.             MOV   R0, R4
  70.             BL    SpiSend
  71.            
  72.             ; Чтение байта (отправка пустого байта)
  73.             MOV   R0, #DUMMY_BYTE
  74.             BL    SpiSend
  75.            
  76.             ; Сохраним принятый байт
  77.             MOV   R4, R0
  78.            
  79.             ; Снять выбор...
  80.             BL    SpiDeselect
  81.            
  82.             ; Результат.
  83.             MOV   R0, R4
  84.            
  85.             POP  {R4,PC}
  86.             ENDP
  87.  
  88. ; Прочитать ускорение по оси X
  89. ; Аргументы: нет
  90. ; Результат: ускорение по оси X (в пределах шкалы)    
  91. swi_AccelX  PROC
  92.             PUSH {LR}
  93.            
  94.             MOV   R0, #LIS302DL_OUT_X_ADDR
  95.             BL    AccelRead
  96.            
  97.             POP  {PC}
  98.             ENDP
  99.  
  100. ; Прочитать ускорение по оси Y
  101. ; Аргументы: нет
  102. ; Результат: ускорение по оси Y (в пределах шкалы)    
  103. swi_AccelY  PROC
  104.             PUSH {LR}
  105.            
  106.             MOV   R0, #LIS302DL_OUT_Y_ADDR
  107.             BL    AccelRead
  108.          
  109.             POP  {PC}
  110.             ENDP
  111.  
  112.  
  113. ; Прочитать ускорение по оси Z
  114. ; Аргументы: нет
  115. ; Результат: ускорение по оси Z (в пределах шкалы)    
  116. swi_AccelZ  PROC
  117.             PUSH {LR}
  118.            
  119.             MOV   R0, #LIS302DL_OUT_Z_ADDR
  120.             BL    AccelRead
  121.            
  122.             POP  {PC}
  123.             ENDP
  124.  
  125. ; Вызов через SVC
  126. AccelX      PROC
  127.             PUSH {LR}
  128.             SVC   2
  129.             POP  {PC}
  130.             ENDP
  131.            
  132. AccelY      PROC
  133.             PUSH {LR}
  134.             SVC   3
  135.             POP  {PC}
  136.             ENDP
  137.            
  138. AccelZ      PROC
  139.             PUSH {LR}
  140.             SVC   4
  141.             POP  {PC}
  142.             ENDP
  143.            
  144. ; Инициализация драйвера (требует инициализированного SPI1)
  145. ; Аргументы: нет
  146. ; Результат: нет    
  147. AccelInit   PROC
  148.             PUSH {LR}
  149.            
  150.             ; Проверка наличия акселерометра
  151.             ; Должно прочитаться 0x3B
  152.             MOV   R0, #LIS302DL_WHO_AM_I_ADDR
  153.            
  154.             BL    AccelRead
  155.            
  156.             CMP   R0, #0x3B
  157.            
  158.             BNE   __exit
  159.            
  160.             ; Настройка акселерометра (control register 1)
  161.             MOV   R0, #LIS302DL_CTRL_REG1_ADDR
  162.            
  163.             MOV   R1, #0
  164.             ORR   R1, #LIS302DL_CTRL_REG1_DR  ; Частота 400 Гц
  165. ;            ORR   R1, #LIS302DL_CTRL_REG1_FS  ; Полная шкала
  166.             ORR   R1, #LIS302DL_CTRL_REG1_PD  ; Активный режим
  167.             ORR   R1, #LIS302DL_CTRL_REG1_ZEN ; Включена ось Z
  168.             ORR   R1, #LIS302DL_CTRL_REG1_YEN ; Включена ось Y
  169.             ORR   R1, #LIS302DL_CTRL_REG1_XEN ; Включена ось X
  170.            
  171.             BL    AccelWrite
  172.            
  173.             ; Настройка фильтрации
  174. ;            MOV   R0, #LIS302DL_CTRL_REG2_ADDR
  175.            
  176. ;            MOV   R1, #0
  177. ;            ORR   R1, #LIS302DL_CTRL_REG2_FDS ; Результат - из фильтра
  178. ;            ORR   R1, #LIS302DL_CTRL_REG2_HP_COEFF1; Уровень: 0b11
  179. ;            ORR   R1, #LIS302DL_CTRL_REG2_HP_COEFF2; Уровень: 0b11
  180.            
  181.             BL    AccelWrite
  182.            
  183. __exit
  184.             POP  {PC}
  185.             ENDP
  186.  
  187.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement