完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我想问一下,SPI通信中初始化完成之后,到底用不用发送0xff来启动数据传输,还有就是初始化的时候我将片选信号置为无效,之后读写的时候才将片选信号拉低,那么如果用写0xFF来启动传输的话,这句是写在初始化中,还是写在每次读写时片选信号拉低之后呢?
|
|
相关推荐
15个回答
|
|
本帖最后由 watercici 于 2018-4-13 11:22 编辑
这是我的初始化函数 void SPI2_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Enable SPI2 and GPIO clocks */ /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO, SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE); /*!< SPI_FLASH_SPI Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); /*!< Configure SPI_FLASH_SPI pins: SCK PB13*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); /*-------------------MISO PB14----------------*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); /*!< Configure SPI_FLASH_SPI pins: MOSI PB15*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); /*----------SPI2_EEPROM_CS-----------------------*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); /* Enable SPI2 */ SPI_Cmd(SPI2, ENABLE); SPI_I2S_SendData(SPI2,0xff); /* Deselect the FLASH: Chip Select high */ SPI2_Flash_CS_HIGH(); } 这是发送函数 void SPI2_Flash_SendByte(u8 dat) { SPI_I2S_SendData(SPI2,dat); while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); } 现在就是发送的时候时钟不对, |
|
|
|
|
|
|
|
软件CS?CS无效的时候,随便你发数据,从机是不会理会这些数据的,我看了半天不懂你想表达什么意思?
|
|
|
|
我粘贴了程序,和逻辑分析仪的抓取结果,逻辑分析仪上CS拉低了,可是时钟和数据都不对,想让大家帮忙看看是真么回事 |
|
|
|
先看看你使用的传感器的手册,不一定要通过0xff发送数据,
|
|
|
|
传感器手册?我没有传感器,我用的是W25Q16的FLASH芯片 |
|
|
|
我知道是什么问题,是SPI分频系数设置的问题“SPI_BaudRatePrescaler”,我一开始是4分频,就没有时钟,后来改成256分频后,有时钟,也发送数据,可是没有回复,我又试了8,16,32,64,发现有时钟,但时钟周期不固定,回复的内容也会因时钟的不同而不同,请教一下SPI的分频系数应根据什么设定,设定多大呢。我选的芯片是W25Q16
|
|
|
|
时钟不对 看看板子了
|
|
|
|
建议用示波器看CLK波形,先确认下波形显示是否有问题,从逻辑分析仪显示的波形来看不正确,不排除逻辑分析仪有问题。我用我的板子试了下2分频,4分频都没问题
|
|
|
|
|
|
|
|
发送0xFF,其实是为了给SPI总线产生时钟,数据才能传输,所以,如果是软件CS的话,必须是在CS拉低发送才会有效
|
|
|
|
这个图不大对呀,看一下实际SPI时钟是多少频率的?你设置的SPI时钟预期是多少频率? 你的4M时钟 够不够呢?要不你把SPI时钟分频降低一点,试试SPI_BaudRatePrescaler_256 |
|
|
|
zhouxk 发表于 2019-1-14 09:11 谢谢,这个问题就是时钟的问题,后来改成256就可以了,谢谢! |
|
|
|
结贴:这个抓取图中时钟不对的问题已经解决了,是SPI初始化中分频系数设置的不对的问题,有原来的4分频改为最低的256分频就可以了。
|
|
|
|
YY599566 发表于 2019-1-14 08:12 时钟的设置要看一下 从机和主机支持的最大时钟是多少 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1307 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1234 浏览 3 评论
2313 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1393 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1824 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 16:51 , Processed in 1.116229 second(s), Total 104, Slave 86 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号