完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
简单的一种技术应用,ARM芯片可以作为master,flash为slaver,实现进行单对单教育通信。ARM主控系统芯片STM32F103,flash芯片为MACRONIX INTERNATIONAL的MX25L6465E,64Mbit。
SPI外设应嵌入在它的最简单的应用程序! SPI应用程序一般有两种方式:软件仿真,模拟手动生成定时和所述SPI主芯片控制器的应用。 一般可以采用世界第二第三种方法进行比较好,比较系统稳定。应用作为主控电路芯片的SPI控制器,要点:正确的初始化SPI、操作SPI各寄存器和正确认识理解flash的时序。下面是过程,采用的是STM32F10X自带的库函数 |
|
|
|
initialization: void Spi FlashIniTialzaTion (void);
要知道硬件是如何连接的 spi1或 spi2连接到闪存,通过连接图表知道我们要操作的是 spi2。 初始化大约三个部分,配置时钟; 配置 gpio; 配置 spi2。 注意这里的 cs 芯片选择器是作为一个通用的 gpio,输出模式是“推挽输出” ,其他 clk,miso,mosi 是“多功能推挽输出” ; 代码: Void SpiFlashIniTIalzaTIon (invalid) { /*初始化的SPI,GPIO结构体*/ SPI_InitTypeDef SPI_InitStructure; GPIO INTYPEDEF GPIO initstructure; RCC_APB1PeriphClockCmd (RCC_APB1Periph_SPI2, ENABLE); / * in RCC_APB1ENB enabled in SPI2 Clock (14 bits) * / RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB, ENABLE); / * SPI2 related because four pins and GPIOB phase * / /*关,GPIOB时钟(位3),这句我们现在发展还不 */ /*确保你想要与否* / * 上面的句子是必要的,因为 cs feet 用作 gpio,调试于2011年1月30日 * / / * Configuration SPI_FLASH_CLK (PB13), SPI_FLASH_MISO (PB14), SPI_FLASH_MOSI (PB15) * / GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; / * alternate function push-pull output * / 50 Mhz; GPIO_Init (GPIOB ,& GPIO_Init Structure); /*配置输入SPI_FLASH_CS(PB12)*/ GPIO_InitStructure. GPIO_Pin=GPIO_Pin_12; GPIO initstructur. Gpio mode gpio mode out PP; * Something something something something * 50 Mhz; GPIO_Init (GPIOB ,& GPIO_Init Structure); SPI_FLASH_CS_SET; /*不选flash*/ /* SPI2配置 增加于2010-01-13*/ / * 注意: 在 spi 模式下,ssi 位确定 nss 引脚上 pb12的水平, * SSM = 1和一个释放销NSS,NSS引脚可以用作GPIO端口* / SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; /*双线双向全双工BIDI MODE=0*/ SPI_InitStructure. SPI_Mode=SPI_Mode_Master;/*SSI 1, MSTR 1* SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; /*SPI发送接收8位帧结构*/ SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; / * CPOL = 1, CPHA = 1, Mode 3 * / SPI initstruct. SPI CPHA CPHA 2edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; / * NSS signal generated by the SSI bit internal control, SSM = 1 * / SPI initstruct. SPI Baudrateprecaler Spi Baudrateprecaler 4; * Something something something 4 * SPI_InitStructure. SPI_FirstBit=SPI_FirstBit_MSB;/* data transfer starts at MSB bits* SPI_InitStructure.SPI_CRCPolynomial = 7; / * reset the default value * / SPI_Init (SPI_SELECT, & SPI_InitStructure); SPI_Cmd (SPI_SELECT, ENABLE);/* } |
|
|
|
正确的操作SPI控制器;
这里我们需要学生注意的是理解SPI状态数据寄存器,特别是SPI_SR位7忙标志位BSY要小心,每次进行操作SPI要先读SPI_SR,BSY不忙才可下一步,然后分析就是通过操作缓冲器了。这里发展还有对于一个重要问题以及曾经也是困扰了我好久,SPI的时序控制问题,就是CLK怎么可以输出信号时序,最后我的理解是SPI每发送任何一个具有字节,CLK就自动会产生不同时序,如果没发送,CLK也就不能停止,这样节省了系统功耗。于是,如果SPI要接收字节,就必须先要发一个公司字节,例如发一个SPI_DUMMY_BYTE,Dummy byte有些flash有定义还是有些企业没有,没有工作的话他们自己不是随便定义作为一个,只要不和命令字相同时间就可以了。 U8 SpiFlashSendByte (U8 SEND_DATA); 8 splash_receive_void; 代码: /*功能:SPI发送一个字节 *参数: send_data: 待发送的字节 *返回: 无*/ u8 SpiFlashSendByte(u8 send_data) { / * 检查忙碌位,spi 的 sr 中的第7位,如果 spi 正在忙碌地通信,直到它不跳出 * / // while (SET ==SPI_I2S_GetFlagStatus (SPI_SELECT, SPI_I2S_FLAG_BSY)); /*检查TXE位,SPI的SR中的位1,发送数据缓冲器以及是否为空,直到空跳出*/ And (RESET == SPI_I2S_GetFlagStatus (SPI_SELECT, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData(SPI_SELECT, send_data); /*发送一个字节*/ / * 发送数据并接收另一个字节 * / and (Reset ==SPI_I2S_GetFlagStatus (SPI_SELECT, SPI_I2S_FLAG_RXNE)); Return (SPI_I2S_ReceiveData (SPI_SELECT)); } / *功能:SPI闪存接收字节 *参数: 接收到的字节 *返回: 无*/ u8 SpiFlashReceiveByte(void) { /*检查RXNE位,SPI的SR中位0,确定信息接收输出缓冲器是有数据的*/ Return SPLASHSENDDBSPI DUMMY BYTE; } |
|
|
|
了解 flash 如何读写
首先,在写入之前必须对数据进行擦除,因为所有flash只能从1变为0,擦除将所有flash设置为1,写入相应位置0。 读写进行操作这部分,flash芯片设计手册可以详细的说明了自己操作方法步骤,需要我们注意的是:flash MX25L64的状态数据寄存器。对flash操作系统之前,先读flash_SR,确保WIP=0(flash空闲),对flash擦除、编程等操作过程中确保WEL=1(flash能够通过接受学生擦出一些编程等操作)。 When the flash memory write, to understand one thing: writing data to the flash memory (ie Page Program (PP), command 02) is based on the page (256 bytes) as a unit, if the data is written to the end of the page, it will be from the first address of the current page to continue to start writing the remaining data, which makes it possible to cause the loss of data, note that it is mainly the manual to understand this passage: page program (PP) instruction is used for programming stored as “0 ”。..。.. If the eight least significant address bits (A7-A0) are not all 0, all transmitted data beyond the end of the current page is the same page from the start address grogrammed (both from the address A7-A0 It is 0)。 If more than 256 bytes are sent to the device, the last 256 bytes of data and previous data programmed in requtest page will be ignored. Is less than 256 bytes 。..。..。 代码: / *功能:启动闪存读取来自指定地址的数据 参数: pdata,读取数据存储指针 address_to_read,数据起始地址待读,地址格式有效位为:A23-A0 返回: 指向读取到的数据进行指针pData_from_flash */ Invalid SpiFlashReadData (U8 * pData_from_flash, U |
|
|
|
只有小组成员才能发言,加入小组>>
924 浏览 1 评论
1082 浏览 1 评论
12505 浏览 0 评论
5922 浏览 3 评论
17714 浏览 6 评论
1020浏览 1评论
1011浏览 1评论
924浏览 1评论
4638浏览 1评论
1083浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 09:40 , Processed in 1.395998 second(s), Total 88, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号