基于飞思卡尔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写完数据后关闭中断。 }

本文来源:https://www.bwwdw.com/article/mk2r.html

Top