SPI的基本用法和知识点

SPI是串行外围总线接口,高速的全双工,同步的通信总线,其在芯片上占用四根引脚。

MISO:主设备数据输入,从设备数据输出;

MOSI:主设备输出,从设备输入;

SCLK:时钟信号,由主设备产生

CS:片选信号

两个非常重要的参数:

CPOL:时钟极性 ;0表示空闲时的电平时低电平,1表示空闲时的电平是高电平。

CPHA:时钟相位;0表示数据在第一个时钟跳变沿,1表示第一个时钟跳变沿采集数据。

 

 

  1. /*
  2. ** 函数名: nRF24L01_WriteReg
  3. ** 返回值: None
  4. ** 参 数 : (1)uint8 addr--寄存器地址
  5. **         (2)uint8 value--写入值
  6. ** 说 明 : nRF24L01寄存器写函数
  7. */
  8. void nRF24L01_WriteReg(uint8 addr, uint8 value)
  9. {
  10.     CSN_OFF();                  //CS片选拉低
  11.     SPI_Write_OneByte(addr|WR); //SPI写地址命令
  12.     SPI_Write_OneByte(value);   //SPI写数据
  13.     CSN_ON();                   //CS片选拉高
  14. }

nRF24L01读寄存器函数:

  1. /*
  2. ** 函数名: nRF24L01_ReadReg
  3. ** 返回值: value--读取寄存器值
  4. ** 参 数 : addr--寄存器地址
  5. ** 说 明 : nRF24L01寄存器读函数
  6. */
  7. uint8 nRF24L01_ReadReg(uint8 addr)
  8. {
  9.     uint8 value;
  10.     CSN_OFF();                   //CS片选拉低
  11.     SPI_Write_OneByte(addr|RR);  //SPI写地址命令
  12.     value = SPI_Read_OneByte();  //SPI读数据
  13.     CSN_ON();                    //CS片选拉高
  14.     return value;
  15. }
  16. /*
  17. ** 函数名: nRF24L01_WriteReg
  18. ** 返回值: None
  19. ** 参 数 : (1)uint8 addr--寄存器地址
  20. **         (2)uint8 value--写入值
  21. ** 说 明 : nRF24L01寄存器写函数
  22. */
  23. void nRF24L01_WriteReg(uint8 addr, uint8 value)
  24. {
  25.     CSN_OFF();                  //CS片选拉低
  26.     SPI_Write_OneByte(addr|WR); //SPI写地址命令
  27.     SPI_Write_OneByte(value);   //SPI写数据
  28.     CSN_ON();                   //CS片选拉高
  29. }
  30. nRF24L01读寄存器函数:
  31. /*
  32. ** 函数名: nRF24L01_ReadReg
  33. ** 返回值: value--读取寄存器值
  34. ** 参 数 : addr--寄存器地址
  35. ** 说 明 : nRF24L01寄存器读函数
  36. */
  37. uint8 nRF24L01_ReadReg(uint8 addr)
  38. {
  39.     uint8 value;
  40.     CSN_OFF();                   //CS片选拉低
  41.     SPI_Write_OneByte(addr|RR);  //SPI写地址命令
  42.     value = SPI_Read_OneByte();  //SPI读数据
  43.     CSN_ON();                    //CS片选拉高
  44.     return value;
  45. }
  46. /*
  47. ** 函数名: nRF24L01_WriteReg
  48. ** 返回值: None
  49. ** 参 数 : (1)uint8 addr--寄存器地址
  50. **         (2)uint8 value--写入值
  51. ** 说 明 : nRF24L01寄存器写函数
  52. */
  53. void nRF24L01_WriteReg(uint8 addr, uint8 value)
  54. {
  55.     CSN_OFF();                  //CS片选拉低
  56.     SPI_Write_OneByte(addr|WR); //SPI写地址命令
  57.     SPI_Write_OneByte(value);   //SPI写数据
  58.     CSN_ON();                   //CS片选拉高
  59. }
  60. nRF24L01读寄存器函数:
  61. /*
  62. ** 函数名: nRF24L01_ReadReg
  63. ** 返回值: value--读取寄存器值
  64. ** 参 数 : addr--寄存器地址
  65. ** 说 明 : nRF24L01寄存器读函数
  66. */
  67. uint8 nRF24L01_ReadReg(uint8 addr)
  68. {
  69.     uint8 value;
  70.     CSN_OFF();                   //CS片选拉低
  71.     SPI_Write_OneByte(addr|RR);  //SPI写地址命令
  72.     value = SPI_Read_OneByte();  //SPI读数据
  73.     CSN_ON();                    //CS片选拉高
  74.     return value;
  75. }

    四种工作模式:

    Mode 0 CPOL=0, CPHA=0 
    Mode 1 CPOL=0, CPHA=1
    Mode 2 CPOL=1, CPHA=0 
    Mode 3 CPOL=1, CPHA=1

    常使用Mode0和Mode3,即在上升沿进行数据的采样和锁存

      COPL:时钟极性。表示在没有数据传输时时钟的空闲状态电平。

         0:SCK 引脚在空闲状态为低电平

         1:SCK 引脚在空闲状态为高电平

     CPHA:时钟相位。表示在第几个时钟边沿进行采样。

     0:SCK 时钟的第一个边沿进行数据位采样,数据在第一个时钟边沿被锁存。

     1:SCK 时钟的第二个边沿进行数据位采样,数据在第二个时钟边沿被锁存。

 

你可能感兴趣的:(STM32)