您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > STM32驱动AT45DB161D代码
1、//SPI初始化部分:voidSPI2_Init(void){RCC-APB2ENR|=13;//PORTB时钟使能RCC-APB1ENR|=114;//SPI2时钟使能//这里只针对SPI口初始化GPIOB-CRH&=0X000FFFFF;GPIOB-CRH|=0XBBB00000;//PB13/14/15复用GPIOB-ODR|=0X713;//PB13/14/15上拉SPI2-CR1|=010;//全双工模式SPI2-CR1|=19;//软件nss管理SPI2-CR1|=18;SPI2-CR1|=12;//SPI主机SPI2-CR1|=011;//8bit数据格式SPI2-CR1|=11;//空闲模式下SCK为1CPOL=1SPI2-CR1|=10;//数据采样从第二个时间边沿开始,CPHA=1//对SPI2属于APB1的外设.时钟频率最大为36M.SPI2-CR1|=73;//Fsck=Fpclk1/256SPI2-CR1|=07;//MSBfirstSPI2-CR1|=16;//SPI设备使能SPI2_ReadWriteByte(0xff);//启动传输}//SPI2读写一。
2、个字节//TxData:要写入的字节//返回值:读取到的字节u8SPI2_ReadWriteByte(u8TxData){u16retry=0;while((SPI2-SR&11)==0)//等待发送区空{retry++;if(retry=0XFFFE)return0;//超时退出}SPI2-DR=TxData;//发送一个byteretry=0;while((SPI2-SR&10)==0)//等待接收完一个byte{retry++;if(retry=0XFFFE)return0;//超时退出}returnSPI2-DR;//返回收到的数据}//以下对存储器的操作都是针对AT45DB161D的,//AT45DB161D:16Mbit=2M字节//voidFLASH_Init(void){RCC-APB2ENR|=13;//使能PORTB时钟RCC-APB2ENR|=18;//使能PORTG时钟GPIOB-CRH&=0XFFF0FFFF;GPIOB-CRH|=0X00030000;//PB12推挽GPIOB-ODR|=112;//PB12上拉GPIOG-CRH&=0XFFFFFFF0;G。
3、PIOG-CRH|=0X00000003;//PG8推挽GPIOG-ODR|=18;//PG8上拉SPI2_Init();//初始化SPI2}//读取AT45DB161D的状态寄存器(查看数据手册P23)//返回:读取的状态//bit7bit6bit5bit4bit3bit2bit1bit0//RDY/BUSYCOMP1011PROTECTPAGESIZEu8Flash_ReadStatus(void){u8rd;FLASH_CS_L;//使能操作SPI2_ReadWriteByte(STATUS_REG_READ);//发送读状态寄存器命令D7H”rd=SPI2_ReadWriteByte(0XFF);//读回状态FLASH_CS_H;//失能操作returnrd;}//FLASH判忙函数//不断读取外部FLASH的状态寄存器的bit7为判断是否为0//bit7:0,忙;1,不忙staticvoidFlash_CheckBusy(void){u8st;st=SPI2_ReadWriteByte(0XFF);while((st&BUSY_BIT_MASK)==BUSY_STATUS){。
4、st=SPI2_ReadWriteByte(0XFF);}}//读FLASH函数,调用者需保证所读取的数据不能超过范围//page:指定页地址(0~4095页)//offset:页内偏移地址(0~527字节)//nBytes:读取的字节数//*data:读到的数组首地址//-----连续读到达一个页的结尾时,芯片会从下个页的开头继续读取,//-----页间的跨越是没有延时的。当主存储器的最后一个位被读出后,//-----芯片会自动返回到第一页的开头继续读取。与页间跨越相同的,//------从存储器阵列结尾转到开头也是无延时的。voidFlash_Read(u16page,u16offset,u16nBytes,u8*data){u32addr;//绝对地址变量,注意528字节每页与512字节每页的绝对地址计算不一样,//这里用默认(264字节每页模式)addr=((u32)page10)+offset;//24根地址线,PA11~PA0为页地址,BA9~BA0为页内//地址,详情请查看数据手册AT45DB161D第31页Table15-7Flash_CheckBusy();//判忙F。
5、LASH_CS_L;SPI2_ReadWriteByte(CONTINUE_ARRAY_READ);//发送连续读命令0BHSPI2_ReadWriteByte((u8)(addr16));//发送地址,从高到低SPI2_ReadWriteByte((u8)(addr8));SPI2_ReadWriteByte((u8)(addr));SPI2_ReadWriteByte(0);//adummybytewhile((nBytes--)0){*data++=SPI2_ReadWriteByte(0XFF);//循环读取字节}FLASH_CS_H;Flash_CheckBusy();}//写FLASH函数,调用者需保证所写入的数据不能超过范围//page:指定页地址(0~4095页)整页直接写入主存储器//*data:待写入的数组首地址voidFlash_PageWrite(u16page,u8*data){u16i;u32addr=0;Flash_CheckBusy();//判忙addr=((u32)page10);//页首地址FLASH_CS_L;SPI2_ReadWriteByte(。
6、MAIN_MEM_PAGE_PROGRAM);//发送主存储器编程命令82HSPI2_ReadWriteByte((u8)(addr16));SPI2_ReadWriteByte((u8)(addr8));SPI2_ReadWriteByte((u8)(addr));for(i=0;i264;i++){SPI2_ReadWriteByte(*data++);//循环写入字节数据}FLASH_CS_H;Flash_CheckBusy();//等待写完}//写入BUFF1函数,调用者需保证所写入的数据不能超过范围//offset:页内偏移地址(0~527字节)//nBytes:写入的字节数(最大528)//*data:待写入的数组首地址voidFlash_WriteBuf(u16offset,u16nBytes,u8*data){Flash_CheckBusy();FLASH_CS_L;SPI2_ReadWriteByte(BUFFER1_WRITE);//发送写BUFF1命令“84H”SPI2_ReadWriteByte(0x00);SPI2_ReadWriteByte((u8)(off。
7、set8));SPI2_ReadWriteByte((u8)offset);while((nBytes--)0){SPI2_ReadWriteByte(*data++);}FLASH_CS_H;Flash_CheckBusy();}//从BUFF1写入到主存储器函数,BUFF1刚好是1页大小的缓存//page:页地址(0~4095)voidFlash_BufToMemory(u16page){u32addr=0;addr=((u32)page10);Flash_CheckBusy();FLASH_CS_L;SPI2_ReadWriteByte(BUFFER1_TO_MEMORY_WITH_ERASE);//发送从BUFF1到//FLASH的写入操作命令83HSPI2_ReadWriteByte((u8)(addr16));SPI2_ReadWriteByte((u8)(addr8));SPI2_ReadWriteByte((u8)(addr));FLASH_CS_H;Flash_CheckBusy();}//页擦除函数,整页进行擦除//page:页地址(0~4095)voidFlash。
8、_PageErase(u16page){u32addr=0;addr=((u32)page10);//计算页的绝对地址Flash_CheckBusy();FLASH_CS_L;SPI2_ReadWriteByte(PAGE_ERASE);//发送页擦除命令“81H”SPI2_ReadWriteByte((u8)(addr16));SPI2_ReadWriteByte((u8)(addr8));SPI2_ReadWriteByte((u8)(addr));FLASH_CS_H;}。
本文标题:STM32驱动AT45DB161D代码
链接地址:https://www.777doc.com/doc-4097139 .html