新手入门 
 
	- 积分
 - 14
 
        - 金钱
 - 14 
 
       - 注册时间
 - 2019-8-7
 
      - 在线时间
 - 7 小时
 
 
 
 | 
 
10金钱 
项目需要用到双路信号同步采样,于是选则了ADI的16位ADC AD7386,它是SPI接口,有片选、时钟、1输入、2输出。ADC芯片的工作模式大概是:拉低CS信号,芯片即开始转换,然后在两个输出引脚同时输出两个通道的转换结果。我用一块407核心板控制ADC芯片,示波器看芯片的两个输出口均有正常波形。SPI主机可以正常收发,从机却不行。在SPI接收中断里查看SPI4数据寄存器DR为空,而且SPI4的控制寄存器CR1也为空,但是明明经过初始化程序了,百思不得其解,附上程序求好心人帮忙分析一下  
 
 
 
void SPI_ADC_Init(void) 
{ 
  SPI_InitTypeDef  SPI_InitStructure; 
  GPIO_InitTypeDef GPIO_InitStructure; 
 
  /* GPIO时钟 */ 
  RCC_AHB1PeriphClockCmd (ADC_MASTER_SPI_SCK_GPIO_CLK | ADC_MASTER_SPI_MISO_GPIO_CLK | ADC_MASTER_SPI_MOSI_GPIO_CLK | 
  ADC_MASTER_CS_GPIO_CLK | ADC_SLAVE_SPI_SCK_GPIO_CLK | ADC_SLAVE_SPI_MOSI_GPIO_CLK | ADC_SLAVE_CS_GPIO_CLK, ENABLE); 
 
  /*SPI时钟*/ 
  RCC_APB2PeriphClockCmd(ADC_MASTER_SPI_CLK, ENABLE); 
  RCC_APB2PeriphClockCmd(ADC_SLAVE_SPI_CLK, ENABLE); 
 
  //GPIO复用 
  GPIO_PinAFConfig(ADC_MASTER_SPI_SCK_GPIO_PORT,ADC_MASTER_SPI_SCK_PINSOURCE,ADC_MASTER_SPI_SCK_AF);  
  GPIO_PinAFConfig(ADC_MASTER_SPI_MISO_GPIO_PORT,ADC_MASTER_SPI_MISO_PINSOURCE,ADC_MASTER_SPI_MISO_AF);  
  GPIO_PinAFConfig(ADC_MASTER_SPI_MOSI_GPIO_PORT,ADC_MASTER_SPI_MOSI_PINSOURCE,ADC_MASTER_SPI_MOSI_AF); 
 
  GPIO_PinAFConfig(ADC_SLAVE_SPI_SCK_GPIO_PORT,ADC_SLAVE_SPI_SCK_PINSOURCE,ADC_SLAVE_SPI_SCK_AF);  
  GPIO_PinAFConfig(ADC_SLAVE_SPI_MOSI_GPIO_PORT,ADC_SLAVE_SPI_MOSI_PINSOURCE,ADC_SLAVE_SPI_MOSI_AF); 
  GPIO_PinAFConfig(ADC_SLAVE_CS_GPIO_PORT,ADC_SLAVE_CS_PINSOURCE,ADC_SLAVE_CS_AF); 
         
  /* ADC_MASTER_SPI_SCK*/ 
  GPIO_InitStructure.GPIO_Pin = ADC_MASTER_SPI_SCK_PIN; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;   
  GPIO_Init(ADC_MASTER_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); 
 
  /* ADC_MASTER_SPI_MISO */ 
  GPIO_InitStructure.GPIO_Pin = ADC_MASTER_SPI_MISO_PIN; 
  GPIO_Init(ADC_MASTER_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); 
 
  /*ADC_MASTER_SPI_MOSI */ 
  GPIO_InitStructure.GPIO_Pin = ADC_MASTER_SPI_MOSI_PIN; 
  GPIO_Init(ADC_MASTER_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);   
 
  /*ADC_MASTER_SPI_CS */ 
  GPIO_InitStructure.GPIO_Pin = ADC_MASTER_CS_PIN; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
  GPIO_Init(ADC_MASTER_CS_GPIO_PORT, &GPIO_InitStructure); 
         
  /*ADC_SLAVE_SPI_SCK */ 
  GPIO_InitStructure.GPIO_Pin = ADC_SLAVE_SPI_SCK_PIN; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
  GPIO_Init(ADC_SLAVE_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); 
         
  /*ADC_SLAVE_SPI_MOSI */ 
  GPIO_InitStructure.GPIO_Pin = ADC_SLAVE_SPI_MOSI_PIN; 
  GPIO_Init(ADC_SLAVE_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);   
 
  /*ADC_SLAVE_SPI_CS */ 
  GPIO_InitStructure.GPIO_Pin = ADC_SLAVE_CS_PIN;         
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;         
  GPIO_Init(ADC_SLAVE_CS_GPIO_PORT, &GPIO_InitStructure); 
 
  /*拉高片选信号*/ 
  SPI_ADC_CS_HIGH(); 
 
  /* ADC_MASTER_SPI SPI1主机模式配置 */ 
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; 
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; 
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; 
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;// 
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
  SPI_InitStructure.SPI_CRCPolynomial = 7; 
  SPI_Init(ADC_MASTER_SPI, &SPI_InitStructure); 
 
  /* ADC_SLAVE_SPI SPI4从机模式配置 */ 
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly; 
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; 
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; 
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; 
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; 
  SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; 
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
  SPI_InitStructure.SPI_CRCPolynomial = 7; 
  SPI_Init(ADC_SLAVE_SPI, &SPI_InitStructure); 
         
  /* 使能SPI  */ 
  SPI_Cmd(ADC_MASTER_SPI, ENABLE); 
  SPI_Cmd(ADC_SLAVE_SPI, ENABLE); 
} 
 
 
 
 
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) 
{ 
  uint16_t tmpreg = 0; 
 
...... 
 
 
  tmpreg = SPIx->CR1; 
 
  tmpreg &= CR1_CLEAR_MASK; 
 
  tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode | 
                  SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL |   
                  SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS |   
                  SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); 
  /* Write to SPIx CR1 */ 
  SPIx->CR1 = tmpreg;   //SPI4初始化程序到这之前都没问题,tmpreg变量的值也没错,和SPI初始化结构体里设置的一样 
 
  /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ 
  SPIx->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SMOD); 
/*---------------------------- SPIx CRCPOLY Configuration --------------------*/ 
  /* Write to SPIx CRCPOLY */ 
  SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial; 
} 
 
 
最后相同的初始化流程,在watch window里面查看SPI1->CR1配置数据正常,而SPI4->CR1里则是0,懵在这里 
 |   
 
 
 
- 
 
 
 
 
最佳答案
查看完整内容[请看2#楼] 
主从spi的话可以参考下这个http://www.openedv.com/forum.php?mod=viewthread&tid=63358&highlight=%D6%F7%B4%D3%2Bspi 
 
 
 
 
 
 
 |