完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32工作在从模式,时钟由AD73360提供,只要使能AD73360,便能提供一个不间断的时钟给STM32。STM32在给AD73360发送控制字时,数据都叠加在MISO线上,且周期性持续。目前无法设置。我用的是STM32F303VC。求大神指导。
|
|
相关推荐
18个回答
|
|
这是我对SPI的GPIO初始化部分
/** SPI3 GPIO Configuration PC10 ------> SPI3_SCK PC11 ------> SPI3_MISO PC12 ------> SPI3_MOSI */ /*Enable or disable the AHB peripheral clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); /*Configure GPIO pin : PC */ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; //SCK GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; //MISO GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; //MOSI GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pin alternate function */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_6); /*Configure GPIO pin alternate function */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_6); /*Configure GPIO pin alternate function */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_6); |
|
|
|
这是我对SPI的初始化代码
SPI_InitTypeDef SPI3_Param; GPIO_SetBits(AD_SE_GPIO_PORT, AD_SE_PIN); //disable AD73360. delay_ms(50); SPI_I2S_DeInit(SPI3); SPI_Cmd(SPI3, DISABLE); /*½ûÄÜSPI3*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); SPI3_Param.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI3_Param.SPI_Mode = SPI_Mode_Slave; SPI3_Param.SPI_DataSize = SPI_DataSize_16b; SPI3_Param.SPI_CPOL = SPI_CPOL_Low; //CPOL = 0 SPI3_Param.SPI_CPHA = SPI_CPHA_2Edge; //CPHA = 1 SPI3_Param.SPI_NSS = SPI_NSS_Soft; SPI3_Param.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI3_Param.SPI_FirstBit = SPI_FirstBit_MSB; SPI3_Param.SPI_CRCPolynomial = 7; SPI_Init(SPI3,&SPI3_Param); SPI_NSSInternalSoftwareConfig(SPI3, SPI_NSSInternalSoft_Reset);//ÉèÖÃÄÚ²¿NSSΪµÍµçƽ SPI_Cmd(SPI3, ENABLE); /*ʹÄÜSPI3*/ |
|
|
|
没看明白。STM32 的 SPI 工作在从模式是没法主动发送数据的。
|
|
|
|
|
|
|
|
这个AD多少M的频率?
|
|
|
|
从模式可以主动发送数据吧。
|
|
|
|
我目前无法与AD73360通讯。我发送的控制字,都叠加在MISO这条数据线上,示波器看到是周期性的方波。最后将AD73360切换回数据模式后,CPU接收到的数据不是我想要的,而是我最后发送的控制字0x8001。 我不知道是哪边出现问题了 |
|
|
|
|
|
|
|
我的意思是,数据发送不是应该一次性的吗,发送完了后MISO上就不应该有波形啊,怎么会出现周期性的方波呢,然后后面还跟前面的叠加起来了。由于数据的叠加,让我无法确定我发送的数据是否正确,只能通过AD73360的表现来判断。目前判断结果就是,AD73360没有被正确设置。 |
|
|
|
从模式没法主动发数据,只有能过中断请求来主动发数据
|
|
|
|
我是在中断的时候给AD73360发送数据的。你看我的代码。
void EXTI0_IRQHandler(void) { if(RESET != EXTI_GetFlagStatus(EXTI_Line0)) { if(exti0_cnt == 0) {SPI_SendData( 0x8000 );} //CRA,Program Mode else if(exti0_cnt == 1) {SPI_SendData( 0x8104 );} //CRB,Decimation Rate£¬8KHz else if(exti0_cnt == 2) {SPI_SendData( 0x8261 );} //CRC else if(exti0_cnt == 3) {SPI_SendData( 0x8388 );} //CRD,open ADC1,ADC2 else if(exti0_cnt == 4) {SPI_SendData( 0x8408 );} //CRE,open ADC3,close ADC4 else if(exti0_cnt == 5) {SPI_SendData( 0x8500 );} //CRF,close ADC5,ADC6 else if(exti0_cnt == 6) {SPI_SendData( 0x8600 );} //CRG else if(exti0_cnt == 7) {SPI_SendData( 0x8700 );} //CRH else if(exti0_cnt == 8) {SPI_SendData( 0x8001 );} //CRA,Data Mode else if(exti0_cnt == 9) {SPI_SendData( 0x7fff);} /*¹Ø±Õ¿ØÖÆ×Ö·¢ËÍ*/ else if(exti0_cnt >= 10) { while(SPI_ReceptionFIFOStatus_Empty != SPI_GetReceptionFIFOStatus(SPI3)) { ADDataBuffer[SampleNum] = SPI_I2S_ReceiveData16(SPI3); //½ÓÊÕÊý¾Ý SampleNum++; } } if(SampleNum >= 320) { SampleNum = 0; } if(exti0_cnt > 250) { exti0_cnt = 10; } exti0_cnt++; } } |
|
|
|
SPI从机是不能主动发数据的 ,因为时钟是主机提供的。而你说AD73360持续在提供时钟,这个时候你的SPI从机是可以发数据的
|
|
|
|
恩。是的。但是我发送的数据却不是一次性的那种。在我发第一个控制字时还正常,发第二个时,数据在MISO上周期性连续。第三个叠加在第二个上,依次类推。但是发送完最后一个后,MISO线上就固定为一个周期性方波了。 好奇怪啊
|
|
|
|
|
|
|
|
AD73360持续在提供时钟,这个时候SPI从机是可以发数据的
|
|
|
|
那不叫发数据,只是从机将数据放在发送寄存器里面,等待时钟过来后主机读取。 |
|
|
|
楼主说的MISO上有叠加信号又是什么意思呢? 是杂波吗?还是楼主没有完全描述完问题现象?? |
|
|
|
楼主你有些乱了,你测试过不用外部AD73360提供时钟吗?用STM32自己的时钟,然后看下波形,然后确定问题所在
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
655 浏览 1 评论
923 浏览 1 评论
1886 浏览 1 评论
1620 浏览 1 评论
MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记
692 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-14 08:34 , Processed in 0.857663 second(s), Total 77, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号