基于飞思卡尔MC9S12XEP的SPI程序
更新时间:2024-04-03 13:24:01 阅读量: 综合文库 文档下载
#define SPI_GLOBALS
#include \
#define Write_To_FlashDataSize 15
static uint8_t Dummy; //选中flash
void SPICSLow(uint8_t Chip) {
if(Chip == 0){
SPI_FLASH1_CS_LOW();//选中flash1 } else{
SPI_FLASH2_CS_LOW();//选中flash2 } }
//不选
void SPICSHigh(uint8_t Chip) {
if(Chip == 0){
SPI_FLASH1_CS_HIGH(); //不选中flash1 } else{
SPI_FLASH2_CS_HIGH(); //不选中flash2 } }
//flash 写使能
void SPIWriteEnable(uint8_t Chip) {
SPICSLow(Chip); //bring the chosen chip's CS pin down Dummy=SPIReadWriteByte(SPI2, SPI_CMD_WREN); //write Write_Enable command SPICSHigh(Chip); //bring the chosen chip's CS pin high }
//flash 写除能
void SPIWriteDisable(uint8_t Chip) {
SPICSLow(Chip); //bring the chosen chip's CS pin down
Dummy = SPIReadWriteByte(SPI2, SPI_CMD_WRDI); //write Write_Disable command
SPICSHigh(Chip); //bring the chosen chip's CS pin down }
//SPI初始化
void SPIInit(void) {
DDRP_DDRP0 = 1; DDRP_DDRP1 = 1; DDRP_DDRP2 = 1; DDRP_DDRP3 = 1;
SPI_WP1_OFF(); SPI_WP2_OFF();
SPI_FLASH1_CS_HIGH(); SPI_FLASH2_CS_HIGH();
SPI2BR = (0<<4) | (0); //(0+1)*2^(0+1) = 2, 20M/2 = 10M SPI2CR1 = 0x50; //主机模式 }
//SPI读flash的ID
SPI_EXT uint16_t SPIReadID(uint8_t Chip) {
uint16_t ID;
SPICSLow(Chip); //bring the chosen chip's CS pin down
Dummy = SPIReadWriteByte(SPI2, SPI_CMD_RDID); //write the Read_ID command
Dummy = SPIReadWriteByte(SPI2, 0x00); //write Addr[16:23] //写24位地址
Dummy = SPIReadWriteByte(SPI2, 0x00); //write Addr[8:15]
Dummy = SPIReadWriteByte(SPI2, 0x00); //write Addr[0:7]
((uint8_t *)&ID)[0] = SPIReadWriteByte(SPI2, SPI_CMD_DUMMY); //manufacturer ID
((uint8_t *)&ID)[1] = SPIReadWriteByte(SPI2, SPI_CMD_DUMMY); //device ID
SPICSHigh(Chip); //bring the chosen chip's CS pin high
return ID; //return the ID value }
// SPI 读flash状态
uint8_t SPIReadSta(uint8_t Chip) {
uint8_t Sta;
SPICSLow(Chip); //bring the chosen chip's CS pin down
Dummy = SPIReadWriteByte(SPI2, SPI_CMD_RDSR); //write the Read_Status command
Sta = SPIReadWriteByte(SPI2, SPI_CMD_DUMMY); //status
SPICSHigh(Chip); //bring the chosen chip's CS pin high
return Sta; //return the status value }
// 等待芯片空闲(在执行Byte-Program,Sector-Erase,Block-Erase,Chip-Erase 操作后
void SPIWaitBusy(uint8_t Chip) {
SPICSLow(Chip);
while ((SPIReadSta(Chip) & 0x01) == 0x01); // waste time until not busy }
///---------------------------------------------------------------------------------------------------------- //Function: SPIFlash 初始化 //Param: //Return: //note
///---------------------------------------------------------------------------------------------------------- SPI_EXT void SPIFlashInit(void) {
uint8_t i; uint16_t ID; SPIInit();
// memset(SPI_Flash_Info, 0, sizeof(SPI_Flash_Info));// for(i = 0; i < SPI_MAX_CHIPS; i++) {
ID = SPIReadID(i);
SPI_Flash_Info[i].DeviceID = ID;
SPI_Flash_Info[i].Size = (uint32_t)8*1024*1024; SPI_Flash_Info[i].SectorSize = 4*1024; SPI_Flash_Info[i].SectorPages = 16;
SPI_Flash_Info[i].BlockSize = (uint32_t)64*1024; SPI_Flash_Info[i].Blocks = 128; SPI_Flash_Info[i].PageSize = 256; SPI_Flash_Info[i].Pages = 65536; }
}
/*-------------------------------------------------------------------------------------------------------- SPI 收发送函数
----------------------------------------------------------------------------------------------------------*/
SPI_EXT uint8_t SPIReadWriteByte(uint8_t SPI, uint8_t Data) {
if(SPI case SPI0: while(SPI0SR_SPTEF==0); SPI0DRL = Data; while(SPI0SR_SPIF==0); return SPI0DRL; break; case SPI2: while(SPI2SR_SPTEF==0); SPI2DRL = Data; while(SPI2SR_SPIF==0); return SPI2DRL; break; } } ///---------------------------------------------------------------------------------------------------------- //Function: 把Chip号芯片的Adress位置开始Len长度的数据读取到Buf中 //Param: //Return: //note ///---------------------------------------------------------------------------------------------------------- SPI_EXT void SPIRead(uint8_t Chip, uint32_t Address, uint8_t *Buf, uint32_t Len) { uint32_t i; SPIWaitBusy(Chip); //判忙 SPICSLow(Chip); //bring the chosen chip's CS pin down Dummy =SPIReadWriteByte(SPI2, SPI_CMD_READ); //write Fast_Read command Dummy =SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[0]); //write Addr[16:23] Dummy =SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[1]); //write Addr[8:15] Dummy =SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[2]); //write Addr[0:7] for(i = 0; i < Len; i += 1) { Buf[i] =SPIReadWriteByte(SPI2, SPI_CMD_DUMMY); //read data } SPICSHigh(Chip); //bring the chosen chip's CS pin high } ///---------------------------------------------------------------------------------------------------------- //Function: 向chip号芯片的Address位置开始的区域写入长度为Len的Buf内容 //Param: //Return: //note ///---------------------------------------------------------------------------------------------------------- SPI_EXT void SPIWritePage(uint8_t Chip, uint32_t Address, uint8_t Buf[], uint32_t Len) { uint8_t i; SPIWriteEnable(Chip); SPICSLow(Chip); //bring the chosen chip's CS pin down Dummy = SPIReadWriteByte(SPI2, SPI_CMD_BYTE_WRITE); //write Byte_Write command Dummy = SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[0]); //write Addr[16:23] Dummy = SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[1]); //write Addr[8:15] Dummy = SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[2]); //write Addr[0:7] for(i=0; i Dummy = SPIReadWriteByte(SPI2, Buf[i]); //write the data to be sent } SPICSHigh(Chip); //bring the chosen chip's CS pin high SPIWaitBusy(Chip); //判忙 } ///---------------------------------------------------------------------------------------------------------- //Function: 擦除flash一个sector //Param: //Return: //note ///---------------------------------------------------------------------------------------------------------- SPI_EXT void SPIEraseSector(uint8_t Chip, uint32_t Address) { SPIWriteEnable(Chip); //write enable SPIWaitBusy(Chip); //判忙 SPICSLow(Chip); //bring the chosen chip's CS pin down Dummy = SPIReadWriteByte(SPI2, SPI_CMD_4K_ERASE); //write 4K_Erase command Dummy = SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[0]); //write Addr[16:23] Dummy = SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[1]); //write Addr[8:15] Dummy = SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[2]); //write Addr[0:7] SPICSHigh(Chip); //bring the chosen chip's CS pin high SPIWriteDisable(Chip); SPIWaitBusy(Chip); //判忙 } ///---------------------------------------------------------------------------------------------------------- //Function: 擦除flash一个block //Param: //Return: //note ///---------------------------------------------------------------------------------------------------------- SPI_EXT void SPIEraseBlock(uint8_t Chip, uint32_t Address) { SPIWriteEnable(Chip); SPIWaitBusy(Chip); //判忙 SPICSLow(Chip); //bring the chosen chip's CS pin down Dummy = SPIReadWriteByte(SPI2, SPI_CMD_64K_ERASE); //write 64K_Erase command Dummy = SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[0]); //write Addr[16:23] Dummy = SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[1]); //write Addr[8:15] Dummy = SPIReadWriteByte(SPI2, ((uint8_t *)&Address)[2]); //write Addr[0:7] SPICSHigh(Chip); //bring the chosen chip's CS pin high SPIWriteDisable(Chip); SPIWaitBusy(Chip); //判忙 } ///---------------------------------------------------------------------------------------------------------- //Function: 擦除flash整片芯片 //Param: //Return: //note ///---------------------------------------------------------------------------------------------------------- SPI_EXT void SPIEraseChip(uint8_t Chip) { SPIWriteEnable(Chip); SPIWaitBusy(Chip); //判忙 SPICSLow(Chip); Dummy = SPIReadWriteByte(SPI2, SPI_CMD_CHIP_ERASE); SPICSHigh(Chip); SPIWaitBusy(Chip); //判忙 SPIWriteDisable(Chip); } /*---------------------------------------------------------------------------------------------------------- 向SPI_FlashBuf里面写入数据 ------------------------------------------------------------------------------------------------------------*/ //SPI_EXT SPIWriteToBuf /*---------------------------------------------------------------------------------------------------------- 向SPI_FlashBuf里面写入数据 ------------------------------------------------------------------------------------------------------------*/ SPI_EXT void SPIWriteToBuf(uint8_t array[],uint8_t array_len) { uint8_t i; for(i=0;i< array_len;i++) SPI_FlashBuf[i] = array[i]; SPI2CR1_SPIE=1;//给SPI缓冲区写完数据,打开中断,将数据写入到Flash里面。 } /*---------------------------------------------------------------------------------------------------------- SPI Flash写入地址 ------------------------------------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------------------------------- SPI中断函数 ------------------------------------------------------------------------------------------------------------*/ SPI_EXT void SPI2_Interrupt() { static uint32_t Address = 0x000000; SPIWritePage(0,Address, SPI_FlashBuf,Write_To_FlashDataSize); //Address = Address + 0x000100 ; // if(Address>=0x800000) // Address=0x000000; SPI2CR1_SPIE=0;//SPI中断函数给Flash写完数据后关闭中断。 }
正在阅读:
金豪积分绩效管理手册05-13
鲁科版第一、二章电场复习课件08-05
L80-1(L80-1性能工序能力分析及正态分布图)08-06
群众路线学习笔记12-11
专业技术个人工作总结03-21
教育的艺术--怎样做个好老师11-22
1《消息二则》名师教案(第1课时)01-19
- 冀教版版五年级科学下册复习资料
- 微生物学复习提纲
- 2013—2014学年小学第二学期教研组工作总结
- 国有土地转让委托服务合同协议范本模板
- 我的固废说明书
- 企业管理诊断报告格式
- 东鼎雅苑施工组织设计
- 谈谈如何做好基层党支部书记工作
- 浮梁县环保局市级文明单位创建工作汇报
- 管理学基础知识
- 大学物理实验报告23 - PN结温度传感器特性1
- 计算机网络实践
- 酒桌上这四种情况下要坐牢,千万别不当回事……
- 国家康居示范工程建设技术要点
- 中国贴布行业市场调查研究报告(目录) - 图文
- 新课标下如何在高中物理教学中培养学生的创新能力初探
- 营养师冬季养生食谱每日一练(7月4日)
- 关注江西2017年第3期药品质量公告
- 建设海绵城市专题习题汇总
- 10万吨年环保净水剂建设项目报告书(2).pdf - 图文
- 卡尔
- 于飞
- MC9S12XEP
- 程序
- SPI