Advertisement
Guest User

stm32 spi driver

a guest
Jan 5th, 2012
460
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.06 KB | None | 0 0
  1. #include "spidrv.h"
  2. #include "uart.h"
  3. #include <stdio.h>
  4.  
  5. #define MOD_NAME "spiddrv.c"
  6. #define DEBUG 1
  7.  
  8. #define GYRO_CS GPIO_Pin_10
  9. #define AXEL_CS GPIO_Pin_11
  10. #define GYRO_RD 0x8000
  11. //#define AXEL_RD 0x0000
  12.  
  13. void spi2_init()
  14. {
  15.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  16.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  17.   GPIO_InitTypeDef GPIO_InitStructure;
  18.   SPI_InitTypeDef SPI_InitStructure;
  19.  
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  21.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  23.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  24.  
  25.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  26.   GPIO_InitStructure.GPIO_Pin = GYRO_CS | AXEL_CS;
  27.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  28.  
  29.   GPIO_SetBits(GPIOB, GYRO_CS);
  30.   GPIO_SetBits(GPIOB, AXEL_CS);
  31.  
  32.  
  33.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  34.  
  35.   SPI_I2S_DeInit(SPI2);
  36.  
  37.   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  38.   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  39.   SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
  40.  
  41.   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  42.   SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  43.   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  44.  
  45.   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
  46.  
  47.   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  48.   SPI_InitStructure.SPI_CRCPolynomial = 7;
  49.   SPI_Init(SPI2, &SPI_InitStructure);
  50.  
  51.   //SPI_CalculateCRC(SPI2, DISABLE);
  52.  
  53.   SPI_Cmd(SPI2, ENABLE);
  54.  
  55. #ifdef DEBUG
  56.   //printf("%s %s - spi2_init() - OK\n\r", DBG,MOD_NAME);
  57.   uart_print("spidrv.c - spi2_init() - OK\n\r");
  58. #endif
  59. }
  60.  
  61. void spi2_write(spiDev dev, uint8_t reg, uint8_t val)
  62. {
  63.   uint16_t data;
  64.   switch (dev)
  65.   {
  66.   case SPI_GYRO:
  67.     {
  68.       GPIO_ResetBits(GPIOB, GYRO_CS);
  69.       GPIO_SetBits(GPIOB, AXEL_CS);
  70.      
  71.       data = (reg << 8) | val;
  72.  
  73.       //while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  74.       SPI_I2S_SendData(SPI2, data);
  75.       while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  76.  
  77.       GPIO_SetBits(GPIOB, GYRO_CS | AXEL_CS);
  78.     }
  79.   break;
  80.    
  81.   case SPI_AXEL:
  82.     {
  83.       GPIO_ResetBits(GPIOB, AXEL_CS);
  84.       GPIO_SetBits(GPIOB, GYRO_CS);
  85.      
  86.       GPIO_SetBits(GPIOB, GYRO_CS | AXEL_CS);
  87.     }
  88.   break;
  89.   }
  90. }
  91.  
  92.  
  93. uint16_t spi2_read(spiDev dev, uint8_t reg)
  94. {
  95.   uint16_t ret;
  96.   uint16_t data;
  97.   switch (dev)
  98.   {
  99.   case SPI_GYRO:
  100.     {
  101.       GPIO_ResetBits(GPIOB, GYRO_CS);
  102.       GPIO_SetBits(GPIOB, AXEL_CS);
  103.       data = GYRO_RD | (reg << 8);
  104.      
  105.       while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  106.       SPI_I2S_SendData(SPI2, data);
  107.      
  108.       while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
  109.       ret = SPI_I2S_ReceiveData(SPI2);
  110.  
  111.       GPIO_SetBits(GPIOB, GYRO_CS | AXEL_CS);
  112.     }
  113.   break;
  114.  
  115.   case SPI_AXEL:
  116.     {
  117.       GPIO_ResetBits(GPIOB, AXEL_CS);
  118.       GPIO_SetBits(GPIOB, GYRO_CS);
  119.      
  120.       GPIO_SetBits(GPIOB, GYRO_CS | AXEL_CS);
  121.     }
  122.   break;
  123.   }
  124.  
  125.   return ret;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement