gronau 发表于 2015-2-28 12:40:23

stm32l051c8 + adc + dac

我们现在用STM32L051来设计一款变送器模块。4~20mA 接口。MCU通过ADC(SPI接口) 采集传感器输出 的信号。因为我们要求ADC的采样率达到50ksps,因此对Mcu的运行效率有非常高的要求,因此官网的HAL库就满足不了(已经试过了),必须用直接操作寄存器的方式来进行。但是SPI接口配置后,启动ADC采集,ADC也输出数据,但是MCU 的SPI接口接收中断标志位就是不置位(RXNE)。不知道什么原因啊。

wxh0000mm 发表于 2015-2-28 12:46:45

能贴点代码吗?

gronau 发表于 2015-2-28 13:06:33

void MX_SPI2_Config(void)
{

/* Enable the peripheral clock SPI2 */
RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;

/* DISABLE TXE IT */
SPI2->CR2 &= ~(SPI_CR2_TXEIE | SPI_CR2_ERRIE | SPI_CR2_FRF | SPI_CR2_SSOE | SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);

/* MASTER MODE, SCK IDLE HIGH */
SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_CPOL;

/* NSS SOFT*/   
SPI2->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI;

    /* RXNE IT */
SPI2->CR2 |= SPI_CR2_RXNEIE;

/* 16 bit frame mode */
SPI2->CR1 |= SPI_CR1_DFF;

/* Enable SPI2 */   
SPI2->CR1 |= SPI_CR1_SPE;

/* Configure IT */
/* Set priority for SPI2_IRQn */
NVIC_SetPriority(SPI2_IRQn, 5);

/* Enable SPI2_IRQn */
NVIC_EnableIRQ(SPI2_IRQn);

}

gronau 发表于 2015-2-28 13:08:33

即使调试的时候单步执行RXNE也不置位。

gronau 发表于 2015-2-28 13:09:38

看datasheet上说只要接收到最后一个位后RXNE就置位,可以接收SPI->DR的数据了。

gronau 发表于 2015-2-28 13:31:05

void MX_EXTADC_Read(void)
{
/* Define the buffer of Data */
uint16_t AdcData = 0x0000;

/* Make the EXTDAC_CS to high and disable the EXTDAC */
MX_EXTDAC_CS_High();

/* Make the EXTADC_CNV to low */
MX_EXTADC_CNV_Low();

/* Make the EXTADC_CNV to high */
MX_EXTADC_CNV_High();

/* Make the EXTADC_CNV to low */
MX_EXTADC_CNV_Low();

/* Generate sck signal */
MX_SPI2_SendWord(0xFFFF);

asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");

}

gronau 发表于 2015-2-28 13:44:30

void SPI2_IRQHandler(void)
{   
if((SPI2->SR & SPI_SR_RXNE) == SPI_SR_RXNE)
{
   SPI2_Data = SPI2->DR;
}
}

lkl0305 发表于 2015-2-28 20:39:25

学习了:):):)

gronau 发表于 2015-3-2 10:28:54

就没有能解决问题的人吗?

mado115 发表于 2015-3-2 11:11:33

DMA不够用吗
页: [1]
查看完整版本: stm32l051c8 + adc + dac