Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SPI
SPI-AD7927采集问题
发布于 2020-03-10 14:52:35 浏览:1378
订阅该版
u32 ADC_Calculate(E_ADC_CHANNEL channel,u8 times) { uint8_t i; // AD通道数目 u32 AD_SampResult= 0; u32 j = 0; if (OSRunning == OS_TRUE) //ucoss系统启动后需要添加这个禁止任务切换,但允许中断打断 LCF { OSSchedLock(); //UCOSII的方式,禁止OS任务调度 } ReadAD7927(1,channel); // ReadAD7927(1,channel); for(i=0;i<=times;i++) { if(i==0) { ReadAD7927(0,channel); // 丢掉每个通道第一次无效数据 delay_ms(2); // 延时至少2ms } else { j = ReadAD7927(0,channel); u1_printf("ADC_Calculate:channel=%u,j=%u!
",channel,j); AD_SampResult += j; delay_ms(1); //延时至少1ms } } AD_SampResult = AD_SampResult/times; if (OSRunning == OS_TRUE) { OSSchedUnlock(); //UCOSII的方式,恢复OS任务调度 } return AD_SampResult; } u16 ReadAD7927(uint8_t cmd,uint8_t tData) { uint16_t value; uint8_t tmp1,tmp2; SpiEnable(SPI1_ADC); Spi_delay(); // 60ns min 单指令时间13.98n if(cmd) { tmp1 = SPI_ReadWriteByte(SPI1_ADC,AD7927CTRREGH|((tData%8)<<2)); tmp2 = SPI_ReadWriteByte(SPI1_ADC,AD7927CTRREGL); } else { tmp1 = SPI_ReadWriteByte(SPI1_ADC,0); tmp2 = SPI_ReadWriteByte(SPI1_ADC,0); value = ((tmp1<<8)&0x0f00)|(tmp2&0x00ff); } SpiDisable(SPI1_ADC); return value; } /************************************************************** * 函数名称: SPI_ReadWriteByte(uint8_t cs,uint8_t TxData) * 参 数: no:SPI端口号(1或2) * 返 回 值: * 描 述: 向SPI外设写读一个数据 ************************************************************** */ uint8_t SPI_ReadWriteByte(uint8_t cs,uint8_t TxData) { if(cs==SPI1_ADC) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据 } else if(cs==SPI2_FLASH) { while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据 } else //SPI2_TF { while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据 } } void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟 //GPIOA5,A6初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 //GPIOB5初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1); //复用 GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1); //复用 GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //复用 //GPIOA4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PA4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 SpiDisable(SPI1_ADC);//SPI ADC不选中 //这里只针对SPI口初始化 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE); //复位SPI1 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//启动SPI1 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 SPI1_SetSpeed(SPI_BaudRatePrescaler_256);//SPI1为84M时钟,传输速度设置为84M/256=328.125KHz SPI_Cmd(SPI1, ENABLE); //使能SPI外设 } 以上是用ucos系统写的 SPI操作读取AD7927模拟量通道数据,没有问题; 现在修改成RTT系统 收到数据不稳定,数据跳变,下面是RTT系统代码 /************************************************************** * 函数名称: 模拟量计算 * 参 数: * 返 回 值: * 描 述: 模拟量计算(保留两位小数) **************************************************************/ rt_uint32_t ADC_Calculate(E_ADC_CHANNEL channel,rt_uint8_t times) { rt_uint8_t i; // AD通道数目 rt_uint32_t AD_SampResult= 0; rt_uint32_t j = 0; rt_lprintf("AAAAAAAAAAA
"); ReadAD7927(1,channel); rt_lprintf("BBBBBBBBBBB
"); rt_thread_mdelay(5); // 延时5ms for(i=0;i<=times;i++) { if(i==0) { ReadAD7927(0,channel); // 丢掉每个通道第一次无效数据 rt_thread_mdelay(5); // 延时2ms } else { j = ReadAD7927(0,channel); rt_lprintf("ADC_Calculate:channel=%u,j=%u!
",channel,j); AD_SampResult += j; rt_thread_mdelay(5); // 延时1ms } } AD_SampResult = AD_SampResult/times; return AD_SampResult; } /************************************************************** * 函数名称:ReadAD7927() * 参 数: tData * 返 回 值: 无 * 描 述: 读取AD采样数据函数 tData: bit7-4: 选择通道 bit3-2:01: 8-bit output length X0: 12-bit output length (see Note) 11: 16-bit output length bit1: 0:MSB out first 1: LSB out first bit0: 0: Unipolar binary 1: Bipolar 2s complement **************************************************************/ uint16_t ReadAD7927(uint8_t cmd,uint8_t tData) { uint16_t value; uint16_t temp1,temp2; extern struct rt_spi_device *spi_dev_ad7927; if(cmd) { rt_spi_sendrecv8(spi_dev_ad7927, AD7927CTRREGH|((tData%8)<<2)); rt_spi_sendrecv8(spi_dev_ad7927, AD7927CTRREGL); } else { temp1 = rt_spi_sendrecv8(spi_dev_ad7927, 0); temp2 = rt_spi_sendrecv8(spi_dev_ad7927, 0); value = ((temp1<<8)&0x0f00)|(temp2&0x00ff); } return value; } /* 查找 spi 设备获取设备句柄 */ spi_dev_ad7927 = (struct rt_spi_device *)rt_device_find(DEVICE_NAME); if (!spi_dev_ad7927) { rt_lprintf("spi sample run failed! can't find %s device!
", DEVICE_NAME); } else { /* config spi */ { struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MASTER | RT_SPI_MSB | RT_SPI_MODE_0; cfg.max_hz = 328125; /* 400K */ rt_spi_configure(spi_dev_ad7927, &cfg); } rt_lprintf("analog:%s find OK!
",DEVICE_NAME); } [0310-144429]analog:ad7927 find OK! [0310-144429AAAAAAAAAAA [0310-144429SPI_MODE_MASTER [0310-144429SPI_DIRECTION_2LINES [0310-144429data_width=8 [0310-144429SPI_PHASE_1EDGE [0310-144429SPI_POLARITY_LOW [0310-144429]cfg->max_hz=328125Hz [0310-144429]SPI_APB_CLOCK=84000000Hz [0310-144429]sys freq: 168000000, pclk2 freq: 84000000, SPI limiting freq: 328125, BaudRatePrescaler: 56 [0310-144429-----131! [0310-144429-----16! [0310-144429BBBBBBBBBBB msh />[0310-144429]oneSec_cnt 参考值=162898,CPU_TICK=200 [0310-144430-----0! [0310-144430-----0! [0310-144430][tcu:]HeartSendCount=10,PowerSendCount=1 [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=631! [0310-144430][tcu:]RevFrameCount=0,osRunTime=1秒 [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=1284! [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=579! [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=267! [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=1791! [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=620! [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=1538! [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=1103! [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=323! [0310-144430-----0! [0310-144430-----0! [0310-144430]ADC_Calculate:channel=0,j=1282! [0310-144430]analog:strYC.V_cp1=3.10V---1000 问下大家可能是什么原因 ,时钟设置256分频了,SPI模式0 8位数,同用SPI,一样的板子 用之前ucoss的就行,移植成RTT接收数据跳变
查看更多
2
个回答
默认排序
按发布时间排序
llichunfei
2020-03-10
这家伙很懒,什么也没写!
已解决 发送时序不对 uint16_t ReadAD7927(uint8_t cmd,uint8_t tData) { uint16_t value,temp1,temp2; extern struct rt_spi_device *spi_dev_ad7927; if(cmd) { rt_spi_sendrecv8(spi_dev_ad7927, AD7927CTRREGH|((tData%8)<<2)); rt_spi_sendrecv8(spi_dev_ad7927, AD7927CTRREGL); } else { rt_spi_recv(spi_dev_ad7927, &temp1,1); rt_spi_recv(spi_dev_ad7927, &temp2,1); value = ((temp1<<8)&0x0f00)|(temp2&0x00ff); } return value; }
llichunfei
2020-03-11
这家伙很懒,什么也没写!
还有个问题 通道转换 有问题 问下大家有没有遇到类似问题 ????
撰写答案
登录
注册新账号
关注者
0
被浏览
1.4k
关于作者
llichunfei
这家伙很懒,什么也没写!
提问
5
回答
32
被采纳
0
关注TA
发私信
相关问题
1
BBB的SPI驱动
2
求个SPI上挂两个或多个设备的使用例子
3
SPI设备有个bug
4
spi flash 的fatfs使用一段时间后读写文件出现故障
5
SPI驱动
6
请教rt_spi_configure函数理解
7
SPI FLASH挂载的问题
8
SPI-FLASH 文件系统 SPIFFS
9
求助一个完整的 spi flash 驱动
10
关于同时使用文件系统与SPI FLASH的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【NXP-MCXA153】 定时器驱动移植
2
GD32F450 看门狗驱动适配
3
【NXP-MCXA153】看门狗驱动移植
4
RT-Thread Studio V2.2.9 Release Note
5
CherryUSB的bootuf2配置
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
16
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
8
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部