[其他] 用MM32F0010做从机时,spi通信出错

[复制链接]
 楼主| 米多0036 发表于 2023-2-23 15:54 | 显示全部楼层 |阅读模式
用MM32做从机spi通信时出错,传输一共是5个数据从第一个数据的第一个bit位就会丢失,不知道什么原因啊。求解答

 楼主| 米多0036 发表于 2023-2-23 15:55 | 显示全部楼层
  1. #define SPI       SPI1

  2. #define SPI_MOSI_BUSCLK                RCC_AHBENR_GPIOA
  3. #define SPI_MOSI_PIN                        GPIO_Pin_9
  4. #define SPI_MOSI_PORT                    GPIOA
  5. #define SPI_MOSI_AFSOURCE          GPIO_PinSource9
  6. #define SPI_MOSI_AFMODE               GPIO_AF_0

  7. #define SPI_NSS_BUSCLK                  RCC_AHBENR_GPIOA
  8. #define SPI_NSS_PIN                          GPIO_Pin_0
  9. #define SPI_NSS_PORT                      GPIOA
  10. #define SPI_NSS_AFSOURCE            GPIO_PinSource15
  11. #define SPI_NSS_AFMODE                 GPIO_AF_0

  12. #define SPI_MISO_BUSCLK                RCC_AHBENR_GPIOA
  13. #define SPI_MISO_PIN                        GPIO_Pin_10
  14. #define SPI_MISO_PORT                    GPIOA
  15. #define SPI_MISO_AFSOURCE          GPIO_PinSource10
  16. #define SPI_MISO_AFMODE              GPIO_AF_0

  17. #define SPI_SCK_BUSCLK                 RCC_AHBENR_GPIOA
  18. #define SPI_SCK_PIN                         GPIO_Pin_8
  19. #define SPI_SCK_PORT                     GPIOA
  20. #define SPI_SCK_AFSOURCE           GPIO_PinSource8
  21. #define SPI_SCK_AFMODE                GPIO_AF_0

  22. static void SPI1_NVIC_Init(void)
  23. {
  24.       /* 串口中断初始化 */
  25.       NVIC_InitTypeDef  NVIC_InitStructure;
  26.       NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
  27.       NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
  28.       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  29.       NVIC_Init(&NVIC_InitStructure);
  30. }

  31. static void SPI1_GPIO_Config(void)
  32. {
  33.       GPIO_InitTypeDef GPIO_InitStructure;
  34.       /* 串口端口初始化 */
  35.       RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
  36.       GPIO_StructInit(&GPIO_InitStructure);
  37.       //spi_cs
  38.       GPIO_InitStructure.GPIO_Pin = SPI_NSS_PIN;
  39.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  40.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  41.       GPIO_Init(SPI_NSS_PORT, &GPIO_InitStructure);
  42.       //spi1_sck
  43.       GPIO_InitStructure.GPIO_Pin = SPI_SCK_PIN;
  44.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  45.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_FLOATING;
  46.       GPIO_Init(SPI_SCK_PORT, &GPIO_InitStructure);
  47.       //spi1_mosi
  48.       GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN;
  49.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  50.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  51.       GPIO_Init(SPI_MOSI_PORT, &GPIO_InitStructure);
  52.       //spi1_miso
  53.       GPIO_InitStructure.GPIO_Pin = SPI_MISO_PIN;
  54.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  55.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  56.       GPIO_Init(SPI_MISO_PORT, &GPIO_InitStructure);

  57.       GPIO_PinAFConfig(SPI_MOSI_PORT, SPI_MOSI_AFSOURCE, SPI_MOSI_AFMODE);
  58.       GPIO_PinAFConfig(SPI_NSS_PORT, SPI_NSS_AFSOURCE, SPI_NSS_AFMODE);
  59.       GPIO_PinAFConfig(SPI_MISO_PORT, SPI_MISO_AFSOURCE, SPI_MISO_AFMODE);
  60.       GPIO_PinAFConfig(SPI_SCK_PORT, SPI_SCK_AFSOURCE, SPI_SCK_AFMODE);
  61. }

  62. static void SPI1_Config(unsigned short spi_baud_div)
  63. {
  64.       SPI_InitTypeDef SPI_InitStructure;
  65.       SPI_StructInit(&SPI_InitStructure);
  66.       RCC_APB1PeriphClockCmd(RCC_APB1ENR_SPI1,ENABLE);

  67.       /* Slave Mode */
  68.       SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
  69.       SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  70.       SPI_InitStructure.SPI_DataWidth = 8;
  71.       SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  72.       SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  73.       SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
  74.       SPI_InitStructure.SPI_BaudRatePrescaler = (SPI_BaudRatePrescaler_TypeDef)spi_baud_div;
  75.       SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  76.       SPI_Init(SPI_ &SPI_InitStructure);

  77.       SPI_SlaveAdjust(SPI, SPI_SlaveAdjust_FAST);
  78.       SPI_CSInternalSelected(SPI, ENABLE);

  79.       /* Enable SPI2 RXEN interrupt */
  80.       SPI_ITConfig(SPI, SPI_IT_RX, ENABLE);
  81.       SPI_BiDirectionalLineConfig(SPI, SPI_Direction_Rx);
  82.       SPI_BiDirectionalLineConfig(SPI, SPI_Direction_Tx);
  83.       SPI_Cmd(SPI, ENABLE);
  84. }

  85. void SPI_Config(unsigned short spi_baud_div)
  86. {
  87.       SPI1_GPIO_Config();
  88.       SPI1_Config(spi_baud_div);
  89.       SPI1_NVIC_Init();
  90. }

  91. void SPI_Send(Use_Typedef *UserTick)
  92. {
  93.       uint8 i, sd[5] = {0xAA, 0, 0, 0, 0xEE};

  94.       sd[1] = UserTick->AdcValue[UserTick->pNum][0];
  95.       sd[2] = UserTick->AdcValue[UserTick->pNum][1] >> 8;
  96.       sd[3] = UserTick->AdcValue[UserTick->pNum][1];

  97.       for(i = 0; i < 5; i++)
  98.       {
  99.          SPI_SendData(SPI, sd[ i ]);
  100.       }
  101. }
 楼主| 米多0036 发表于 2023-2-23 15:56 | 显示全部楼层
SPI的相关代码在这里。
用示波器检测波形,与接收情况一致。
硬件上应该是没问题。但接收就是出错。
好疑惑
tpgf 发表于 2023-3-3 09:37 | 显示全部楼层
楼主使用的是什么模式的spi通讯模式啊
nawu 发表于 2023-3-3 09:48 | 显示全部楼层
米多0036 发表于 2023-2-23 15:56
SPI的相关代码在这里。
用示波器检测波形,与接收情况一致。
硬件上应该是没问题。但接收就是出错。

把两个电路板换一下  就是接收和发送调换试试看
aoyi 发表于 2023-3-3 10:32 | 显示全部楼层
接收端使用的是什么方式进行接收数据的呢
zljiu 发表于 2023-3-3 10:44 | 显示全部楼层
其他四个数据有没有丢失bit的现象呢
gwsan 发表于 2023-3-3 10:56 | 显示全部楼层
每帧数据发送的时间间隔加长一点试试看
tfqi 发表于 2023-3-3 11:12 | 显示全部楼层
发送数据的波形符合spi的通讯协议吗
Undshing 发表于 2023-3-9 19:35 | 显示全部楼层
spi通讯用的什么模式?
Jacquetry 发表于 2023-3-12 22:13 | 显示全部楼层
调换下接收和发送试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

136

主题

1429

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部