新手入门
- 积分
- 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
|