#include "spi.h"
void Delay(uint8 time)
{
uint8 i,j,k;
for(i=0;i<time;i++)
{for(j=0;j<255;j++);
{for(k=0;k<255;k++);
}
}
}
void spi_init()
{
P1SEL|=0xE0;// P1_7, P1_6, and P1_5 are peripherals
P1SEL&=0xF7;//令P1_3做GPIO
PERCFG|=0x2;
//这里是你没有想到的引脚输出反向为输出
P1DIR |= 0x08;//令P1_3做输出
//引脚连接
P2SEL|=0x40;
P2SEL&=0xDF;
//设置优先级别
U1CSR&=0x7f;//设置为spi模式
U1CSR=0x40;//设置为spi主机,允许接收
U1BAUD=216;
U1GCR=0x2b;//这个决定A.波特率的分配值,B.LSB还是MSB,C.时钟相位还是极性
//设置时钟为11059200
}
void SPI_Write(uint8 Command)
{uint8 temp;
//亮灯表示发送中
spi_PinSet();
HalLedSet(HAL_LED_2 ,HAL_LED_MODE_ON);
//HalLcd_PutString_cn(0,HAL_LCD_LINE_1,"正在写入命令");
CSn_LCD=1;
U1DBUF=Command;
while(0==(U1CSR&(1<<1)));//直到发送完成
U1CSR&=~(1<<1);//清楚标志位
HalLedSet(HAL_LED_2 ,HAL_LED_MODE_ON);
//CSn_LCD=0;
//HalLcd_PutString_cn(0,HAL_LCD_LINE_2,"命令写入完成");
//HalLedSet(HAL_LED_2 ,HAL_LED_MODE_OFF );
temp=U1DBUF;
(void)temp;
CSn_LCD=0;
}
uint8 SPI_Read(void)
{uint8 temp;
spi_PinSet();
CSn_LCD=1;
U1DBUF=0xff;
while(0==(U1CSR&(1<<1)));//直到发送完成
temp=U1DBUF;
U1CSR&=~(1<<1);
return temp;
}
uint8 getFlashtypeID(void)
{uint8 temp;
long k=7874;
CSn_Flash=0;
SPI_Write(wake_up );
M25P80_Write24ADDR(k);
temp=SPI_Read();
CSn_Flash=1;
return temp;
}
void MP25_WriteEnable(void)
{spi_PinSet();
CSn_Flash=0; //片选
SPI_Write(Write_Enable); //写使能
Delay(10);
CSn_Flash=1; //禁止片选
Delay(10);
}
uint8 MP25_ReadStatus(void)
{
uint8 Reg_Temp;
spi_PinSet();
CSn_Flash=0; //片选
SPI_Write(Read_Status); //写指令
Reg_Temp=SPI_Read(); //数据读出
CSn_Flash=1; //禁止片选
Delay(10);
return(Reg_Temp); //返回值
}
void MP25_Check(void)
{spi_PinSet();
while(MP25_ReadStatus() & 0X01) ;
}
void MP25_WriteDisable(void)
{spi_PinSet();
CSn_Flash=0; //片选
SPI_Write( Write_Disable); //写禁止
CSn_Flash=1; //禁止片选
//
Delay(10);
}
void MP25_WriteStatus(uint8 Status)
{spi_PinSet();
MP25_WriteEnable(); //写使能
CSn_Flash=0; //片选
SPI_Write(Write_Status ); //写指令
SPI_Write(Status); //写数据
CSn_Flash=1; //禁止片选
MP25_Check();
MP25_WriteDisable(); //写禁止
}
void M25P80_Write24ADDR(long ADDR24)
{uint8 i=0;
uint8 temp;
spi_PinSet();
for(i=0;i<3;i++)
{ temp=(uint8)ADDR24;
SPI_Write( temp);
ADDR24=ADDR24>>8;
}
// for(i=24;i>0;i--)
// {
// if( (ADDR24 & 0X800000 ) == 0x800000 )
// {
// MOSI=1; //写入1
// }
// else
// {
// MOSI=0; //写入0
// }
// SCLK=0;
// Delay(5);
// SCLK=1;
// ADDR24<<=1; //左移
// }
}
uint8 M25P80_Read_Byte(long ADDR)
{ spi_PinSet();
uint8 Data_Temp;
CSn_Flash=0; //片选
SPI_Write( Read_Data ); //写指令
M25P80_Write24ADDR( ADDR); //写地址
Data_Temp = SPI_Read(); //数据读出操作
CSn_Flash=1; //禁止片选
Delay(10);
return (Data_Temp);
}
void MP25_Write_Byte(long Addr,uint8 data)
{spi_PinSet();
MP25_WriteEnable(); //写使能
CSn_Flash=0; //片选
SPI_Write(Page_Program); //页写指令
M25P80_Write24ADDR(Addr); //写指令,注意这里的ADRR最后8位最好全为0,然后一次最多只能写256B否则会在同样一个页的第一个地址进行覆盖
SPI_Write(data); //写数据
CSn_Flash=1; //禁止片选,这时候芯片才自己开始编程,所以要延时一段时间
Delay(255);
MP25_Check();
Delay(10);
MP25_WriteDisable(); //写禁止
}
void MP25_Write_nByte(long Addr,uint8*buffer,uint8 nByte) //double 改为 uchar
{spi_PinSet();
uint8 i;
MP25_WriteEnable(); //写使能
CSn_Flash=0; //片选
SPI_Write(Page_Program); //页写指令
M25P80_Write24ADDR(Addr); //写指令
for(i=0 ; i<nByte ; i++)
{
SPI_Write(*(buffer+i)); //写数据
}
CSn_Flash=1; //禁止片选,mp25开始编程,系统等待
Delay(255);
MP25_Check();
MP25_WriteDisable(); //写禁止
}
void MP25_EraseSector(long Addr)
{spi_PinSet();
MP25_WriteEnable(); //写使能
CSn_Flash=0; //片选
SPI_Write( Sector_Erase); //扇区擦除指令
M25P80_Write24ADDR(Addr); //写指令
CSn_Flash=1; //禁止片选
Delay(255);//擦出需要时间
MP25_Check();
MP25_WriteDisable(); //写禁止
}
void MP25_EraseBulk(void)
{spi_PinSet();
MP25_WriteEnable(); //写使能
CSn_Flash=0; //片选
SPI_Write(Bulk_Erase); //批擦除指令
CSn_Flash=1; //禁止片选
MP25_Check(); //等待操作完毕
MP25_WriteDisable(); //写禁止
}
void M25P80_Read_nByte(long ADDR,uint8*buffer,uint8 nByte)
{
uint8 i;
spi_PinSet();
CSn_Flash=0; //片选
SPI_Write( Read_Data); //写指令
M25P80_Write24ADDR(ADDR); //写地址
//Data_Temp = SPI_Read(); //数据读出操作
for(i=0 ; i<nByte ; i++)
{
*(buffer+i)=SPI_Read(); //读取数据
}
CSn_Flash=1; //禁止片选
Delay(10);
}
void M25P80_Init(void)
{spi_PinSet();
CSn_Flash=1;
SCLK=0;
MP25_WriteStatus(0x00);
}
void spi_PinSet(void)
{P1SEL|=0xE0;// P1_7, P1_6, and P1_5 are peripherals
P1SEL&=0xF7;//令P1_3做GPIO
PERCFG|=0x2;
//这里是你没有想到的引脚输出反向为输出
P1DIR |= 0x08;//令P1_3做输出
//引脚连接
P2SEL|=0x40;
P2SEL&=0xDF;
//设置优先级别
}
基于CC2530读写M25p80的代码,SPI接口
5星 · 超过95%的资源 需积分: 10 61 浏览量
2010-05-09
21:36:40
上传
评论 6
收藏 3KB RAR 举报
liaojiededepan
- 粉丝: 10
- 资源: 25
最新资源
- Assignment2(4).ipynb
- 用pytorch框架实现的油井时间序列动态预测的模型,其中包含一些传统的时间序列预测方法 .zip
- TimesNet作为一般时间序列分析强大的基础模型 在长短期预测、插补、异常检测和分类5个主流任务上取得了一致的前沿成果.zip
- 实现结构体序列化和反序列化工具类CSearchive,支持基本类型,C++STL容器以及对象 .zip
- 时间序列遥感变化检测.zip
- 时间序列数据集收集以及数据分析.zip
- 时间序列分析ARIMA预测模型.zip
- 深度学习- 时间序列预测.zip
- 计算给定时间序列的平均值、方差、概率分布(大致的分布)、自协方差函数.zip
- 基于spring boot上的注解缓存,自带轻量级缓存管理页面.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
- 6
前往页