2016年3月30日 星期三

nRF51x22 SPI Master Driver

1. 簡單替nRF51822 SPI Driver做個備份.

2. 本範例搭配ST LIS3DH Sensor Board測試使用.

3. 需先include spi_master.c 和 spi_master.h, 路徑在 \app\components\drivers_nrf\spi_master\ 底下.



4. spi_master.c 和 spi_master.h 的下載連結:

    spi_master.c

    spi_master.h

5. code:

spi_example.h

  1. #include "app_util_platform.h"
  2. #include "bsp.h"
  3. #include "spi_master.h"
  4.  
  5. bool SPI_Write( uint8_t register_address, uint8_t *value, uint8_t number_of_bytes );
  6. bool SPI_Read( uint8_t register_address, uint8_t *destination, uint8_t number_of_bytes );
  7.  

spi_example.c

  1. #include "spi_example.h"
  2.  
  3.  
  4. static void spi_master_init(spi_master_hw_instance_t spi_master_instance )
  5. {
  6. uint32_t err_code = NRF_SUCCESS;
  7.  
  8. // Configure SPI master.
  9. spi_master_config_t spi_config = SPI_MASTER_INIT_DEFAULT;
  10. spi_config.SPI_CONFIG_CPHA=SPI_CONFIG_CPHA_Leading ;
  11. spi_config.SPI_CONFIG_CPOL=SPI_CONFIG_CPOL_ActiveHigh;
  12. spi_config.SPI_Pin_SCK = SPIM0_SCK_PIN;
  13. spi_config.SPI_Pin_MISO = SPIM0_MISO_PIN;
  14. spi_config.SPI_Pin_MOSI = SPIM0_MOSI_PIN;
  15. spi_config.SPI_Pin_SS = SPIM0_SS_PIN;
  16. spi_config.SPI_Freq = SPI_FREQUENCY_FREQUENCY_M4;
  17. spi_config.SPI_CONFIG_ORDER = SPI_CONFIG_ORDER_MsbFirst;
  18. spi_config.SPI_PriorityIRQ = APP_IRQ_PRIORITY_LOW;
  19. spi_config.SPI_DisableAllIRQ = 0;
  20. err_code = spi_master_open(spi_master_instance, &spi_config);
  21. APP_ERROR_CHECK(err_code);
  22. }
  23.  
  24. static void spi_send_recv(const spi_master_hw_instance_t spi_master_hw_instance, uint8_t * const p_tx_data, uint8_t * const p_rx_data, const uint16_t len)
  25. {
  26. // Start transfer.
  27. spi_master_init(spi_master_hw_instance);
  28. uint32_t err_code = spi_master_send_recv(spi_master_hw_instance, p_tx_data, len, p_rx_data, len);
  29. APP_ERROR_CHECK(err_code);
  30. for (int i = 0 ; i < 1000 ; i++ ) {
  31. if ( spi_master_get_state(spi_master_hw_instance) != SPI_MASTER_STATE_BUSY )
  32. break;
  33. }
  34. spi_master_close(spi_master_hw_instance);
  35. }
  36.  
  37. bool SPI_Write( uint8_t register_address, uint8_t *value, uint8_t number_of_bytes )
  38. {
  39. #define i2c_write_data_len 6
  40. uint8_t w2_data[i2c_write_data_len+1];
  41. uint8_t r2_data[i2c_write_data_len+1];
  42. uint8_t i;
  43.  
  44. if(number_of_bytes > 0x01)
  45. {
  46. register_address |= (uint8_t)MULTIPLEBYTE_CMD;
  47. }
  48. w2_data[0] = register_address;
  49. for ( i = 0 ; i < number_of_bytes ; i++ ) {
  50. w2_data[i+1] = value[i];
  51. }
  52.  
  53. spi_send_recv(SPI_MASTER_0, w2_data, r2_data, number_of_bytes +1);
  54.  
  55. return true;
  56. }
  57.  
  58. bool SPI_Read(uint8_t register_address, uint8_t * destination, uint8_t number_of_bytes)
  59. {
  60. #define i2c_read_data_len 8
  61.  
  62. uint8_t w2_data[i2c_write_data_len+1];
  63. uint8_t r2_data[i2c_write_data_len+1];
  64. uint8_t i;
  65.  
  66. if(number_of_bytes > 0x01)
  67. {
  68. register_address |= (uint8_t)(READWRITE_CMD | MULTIPLEBYTE_CMD);
  69. }
  70. else
  71. {
  72. register_address |= (uint8_t)READWRITE_CMD;
  73. }
  74. w2_data[0] = register_address;
  75. spi_send_recv(SPI_MASTER_0, w2_data, r2_data, number_of_bytes+1);
  76. for( i = 0 ; i < number_of_bytes ; i++ ) {
  77. destination[i] = r2_data[i+1];
  78. }
  79.  
  80. return true;
  81. }
  82.  

6. example-1:  read WHO_AM_I register(0x0F) from LIS3DH.

  1. #define LIS3DH_REGISTER_WHO_AM_I 0x0F
  2.  
  3. void Read_LIS3DH_WHOAMI_Register(void)
  4. {
  5. uint8_t temp[6];
  6. SPI_Read(LIS3DH_REGISTER_WHO_AM_I, temp, 1);
  7. if ( temp[0] == 0x33 ) {
  8. while(1);
  9. }
  10. }
  11.  




7. example-2: Enable LIS3DH Sensor.

  1. #define LIS3DH_CTRL_REG1_DATARATE_100HZ 0x50
  2. #define LIS3DH_CTRL_REG1_XYZEN 0x07
  3. #define LIS3DH_REGISTER_CTRL_REG1 0x20
  4.  
  5. void Enable_LIS3DH_Sensor(void)
  6. {
  7. uint8_t temp[6];
  8. temp[0] = (LIS3DH_CTRL_REG1_DATARATE_100HZ | LIS3DH_CTRL_REG1_XYZEN);
  9. SPI_Write( LIS3DH_REGISTER_CTRL_REG1, temp, 1 );
  10. }
 




沒有留言:

張貼留言