关于AD转换芯片TLV2548,如何利用STM32f103的SPI、DMA实现数据接收 ?请各位大神指点一二,最好能给点例程,谢谢!由于初学,代码错的地方很多

jinaiguo2015 2017-10-11 11:24:03
int main(void)
{
unsigned char i,j,k;
/*初始化设置*/
RCC_TLV2548_Init();
GPIO_TLV2548_Init();
NVIC_TLV2548_Init();
SPI_TLV2548_Init();
// DMA_TLV2548_Init();

/*串口2配置*/
USART2_Config();
printf("\r\n TLV2548数据传输实验 \r\n");
/*TLV2548初始化*/
SPI_SCLK_Low();
SPI_TLV2548_CS_HIGH();
/*配置寄存器初始化 0xA000*/
ADC_Write_Command(Command);
/*确定工作模式 0xA2E0*/
ADC_Write_Command(Mode);
SPI_TLV2548_CS_HIGH();
/*数据采集 8个通道*/
SPI_TLV2548_CSTART_HIGH();
for(j=0;j<8;j++)
{
SPI_TLV2548_CSTART_Low();
Delay_us(5); // >3.6us延时等待转换
}
/*A/D转换值FIFO的读取*/
for(k=0;k<8;k++)
{
AD_ConvertedValue[k] = SPI_TLV2548_SendByte();
Delay_ms(1000);
}


#include "SPI_TLV2548.h"
//__IO uint16_t AD_ConvertedValue[8];
__IO float AD_ConvertedValue[8];

u8 SPI_TLV2548_SendByte(u8 byte)
{
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

/* Send byte through the SPI1 peripheral */
SPI_I2S_SendData(SPI1, byte);

/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI1);
}

void ADC_Write_Command(u16 Data)
{
u16 Data_High,Data_Low;
Data_High = Data >> 8; // 高8位
Data_Low = Data &0x00ff; // 地8位
SPI_TLV2548_CS_Low();
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_TLV2548_SendByte(Data_High);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_TLV2548_SendByte(Data_Low);
SPI_TLV2548_CS_HIGH();
}

void RCC_TLV2548_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

}

void GPIO_TLV2548_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*(ADCS)PC4 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/* /CSTART PC5下降沿开始采样800ns,上升沿采样结束转换开始*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/* ADC_INT PA4*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/*SCK(CLK) PA5*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* MOSI(DIN)(主机)单片机输出,从机输入 PA7*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* MISO(DOUT)PA6 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/*PA1 开通电平转换芯片*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_1);

}

/* ADC_INT PA4 外部中断设置*/
void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);
EXTI_ClearITPendingBit(EXTI_Line4);

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}

void NVIC_TLV2548_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/*DMA NVIC configuration*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/*PA4外部中断 配置*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void SPI_TLV2548_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;

SPI_TLV2548_CS_HIGH();

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //单片机提供时钟信号,若是slave则有外设提供时钟
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //16 bits transmission
//四种工作模式,看W25X16手册第10页//
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //CPOL=0,空闲时置低电平 CPOL=1,空闲时置高电平 对于SCLK信号起作用//
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //CPHA=1,奇跳变采样 CPHA=2 偶跳变采样

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //片选端
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //4分频,9MHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC校验中的多项式
SPI_Init(SPI1, &SPI_InitStructure);

/* Enable SPI1 /DMA */
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);//使能SPI1 DMA接收功能
SPI_Cmd(SPI1, ENABLE);//使能SPI1

}

void DMA_TLV2548_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
/*DMA channel 2 configuration SPI1_Rx*/
DMA_DeInit(DMA1_Channel2);
DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&SPI1->DR; //SPI1_DR_Addr 0x4001300C
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_ConvertedValue ; //设置SPI1发送外设地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //传输方向:外设到内存
DMA_InitStructure.DMA_BufferSize = SPI1_ReceiveBufferSize; //设置SPI1发送长度 8 即开辟8个通道
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设传输宽度 2字节
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存传输宽度 2字节
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环采集数据
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //优先级中
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);

DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE); //使能DMA通道2 允许发送完成后中断
/* Enable SPI1 DMA RX request */
SPI1->CR2 |= 1<<0; //接收缓冲区DMA使能
DMA_Cmd(DMA1_Channel2,ENABLE);//使能SPI1 DMA发送通道

}

...全文
286 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧