dsp写X25043--DSP的SPI对EEPROM接口
/*串行EEPROMMAX25045写使能命令*/
void WREN_X5045(void) /*写使能*/
{
SPIBUF=RSDR_X5045();
while ((SPIBUF & 0x01) != 0){SPIBUF=RSDR_X5045();}/*等待内部写结束*/
PFDATDIR=PFDATDIR | 0x08; /*取消写保护*/
TIME(1);
PFDATDIR=PFDATDIR & 0xFFFB; /*选择X5045*/
SPICCR = 0x07; /*复位上升沿,8位字符长度*/
SPICTL = 0x0e; /*有延时,主方式,禁止SPI中断*/
SPIBRR = 0x13; /*波特率为1.5MHz*/
SPIPRI = 0x40; /*低中断优先级*/
SPICCR = 0x87; /*进入工作状态*/
SPITXBUF = 0X0600; /*发送写使能命令*/
while (SPISTS == 0){}
SPIBUF=SPIRXBUF;
SPISTS=0xFF; /*清除标志位*/
PFDATDIR=PFDATDIR | 0x0004; /*清除选择X5045*/
TIME(1); /*延时1US*/
}
void WRSR_X5045(unsigned int COM) /*写状态*/
{
WREN_X5045(); /*写使能*/
PFDATDIR=PFDATDIR & 0xFFFB; /*选择X5045*/
SPICCR = 0x0F; /*复位上升沿,15位字符长度*/
SPICTL = 0x0e; /*有延时,主方式,禁止SPI中断*/
SPIBRR = 0x13; /*波特率为1.5MHz0d*/
SPIPRI = 0x40; /*低中断优先级*/
SPICCR = 0x8f; /*进入工作状态*/
SPITXBUF = COM | 0x0100; /*发送写状态命令*/
while (SPISTS == 0){}
SPIBUF=SPIRXBUF;
SPISTS=0xFF; /*清除标志位*/
PFDATDIR=PFDATDIR | 0x0004; /*清除选择X5045*/
PFDATDIR=PFDATDIR & 0xFFF7; /*写保护*/
}
/*写EEPROM*//*RA_ADDR为RAM数据首地址,EEP_ADDR为EEP地址,N<4个数8位,H为8选择高地址*/
void WRITE_X5045(unsigned int * RA_ADDR,unsigned int EEP_ADDR,unsigned int N,unsigned int H)
{
unsigned int I;
SPIBUF=RSDR_X5045();
while ((SPIBUF & 0x01) != 0){SPIBUF=RSDR_X5045();}/*等待内部写结束*/
WREN_X5045(); /*写使能*/
PFDATDIR=PFDATDIR & 0xFFFB; /*选择X5045*/
SPICCR = 0x07; /*复位上升沿,8位字符长度*/
SPICTL = 0x0e; /*有延时,主方式,禁止SPI中断*/
SPIBRR = 0x13; /*波特率为1.5MHz*/
SPIPRI = 0x40; /*低中断优先级*/
SPICCR = 0x87; /*进入工作状态*/
SPIBUF=((H | 0x02) << 8);
SPITXBUF = SPIBUF; /*发送写命令*/
while (SPISTS == 0){}
SPIBUF=SPIRXBUF;
SPISTS=0xFF; /*清除标志位*/
SPITXBUF = (EEP_ADDR << 8); /*发送地址*/
while (SPISTS == 0){}
SPIBUF=SPIRXBUF;
SPISTS=0xFF; /*清除标志位*/
for (I=0;I<N;I++)
{
SPITXBUF =( * (RA_ADDR+I) << 8); /*发送数据*/
while (SPISTS == 0){}
SPIBUF=SPIRXBUF;
SPISTS=0xFF; /*清除标志位*/
}
PFDATDIR=PFDATDIR | 0x0004; /*清除选择X5045*/
PFDATDIR=PFDATDIR & 0xFFF7; /*写保护*/
}
/*读EEPROM*//*RA_ADDR为RAM数据首地址,EEP_ADDR为EEP地址,N为字符个数8位,H为8选择高地址*/
void READ_X5045(unsigned int * RA_ADDR,unsigned int EEP_ADDR,unsigned int N,unsigned int H)
{
unsigned int I;
SPIBUF=RSDR_X5045();
while ((SPIBUF & 0x01) != 0){SPIBUF=RSDR_X5045();}/*等待内部写结束*/
PFDATDIR=PFDATDIR & 0xFFFB; /*选择X5045*/
SPICCR = 0x07; /*复位上升沿,8位字符长度*/
SPICTL = 0x0e; /*有延时,主方式,禁止SPI中断*/
SPIBRR = 0x13; /*波特率为1.0MHz*/
SPIPRI = 0x40; /*低中断优先级*/
SPICCR = 0x87; /*进入工作状态*/
SPITXBUF = (H | 0x03) << 8; /*发送读命令*/
while (SPISTS == 0){}
SPIBUF=SPIRXBUF;
SPISTS=0xFF; /*清除标志位*/
SPITXBUF = EEP_ADDR << 8; /*发送地址*/
while (SPISTS == 0){}
SPIBUF=SPIRXBUF;
SPISTS=0xFF; /*清除标志位*/
for (I=0;I<N;I++)
{
SPITXBUF = 0; /*发送伪数据*/
while (SPISTS == 0){}
*(RA_ADDR+I) = SPIRXBUF & 0xff;
SPISTS=0xFF; /*清除标志位*/
}
PFDATDIR=PFDATDIR | 0x0004; /*清除选择X5045*/
}
/*读状态寄存器*/
unsigned int RSDR_X5045(void)
{
TIME(1);
PFDATDIR=PFDATDIR & 0xFFFB; /*选择X5045*/
SPICCR = 0x07; /*复位上升沿,8位字符长度*/
SPICTL = 0x0e; /*有延时,主方式,禁止SPI中断*/
SPIBRR = 0x13; /*波特率为1.0MHz*/
SPIPRI = 0x40; /*低中断优先级*/
SPICCR = 0x87; /*进入工作状态*/
SPITXBUF =0x0500; /*发送读命令*/
while (SPISTS == 0){}
SPIBUF=SPIRXBUF;
SPISTS=0xFF; /*清除标志位*/
SPITXBUF = 0; /*发送伪数据*/
while (SPISTS == 0){}
SPIBUF=SPIRXBUF;
SPISTS=0xFF; /*清除标志位*/
PFDATDIR=PFDATDIR | 0x0004; /*清除选择X5045*/
return SPIBUF;
}
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
Lynx公司工具产品介绍
测试用脉冲信号发生器
N相时钟源
一季度非发达国家/地区智能手机市场速递
[转帖]美女的化学水平
LPC2000系列ARM-CAN控制器驱动程序的使用指南
Logiscope介绍
多相电机的奇妙世界(1):从三相到多相的跨越
LPC2104芯片手册
基础教程:差分放大器以及相关设计软件的基础知识
办公室中有男有女是件“好事”吗?
高达l2.58MHz的可变脉宽脉冲振荡器
CoolSiC™ MOSFET G2如何正确选型
码住这份指南:Edge AI与机器学习常用硬件类型与开发板全解析
M27128A数据手册
基础教程:运算放大器和专用放大器的应用和常识
基础教程:电压基准源产品
求助:SL811HST读写U盘
AI 时代,如何为消费电子设备的安全性保驾护航?
最新中国电子电路行业营收TOP 100
基础教程:模拟开关和多路复用器基础知识
基础教程: 理解数据采样系统
选对运用软件的方法,使 AI 创新如虎添翼
不是没人材而没伯乐
N相节拍脉冲源
四相节拍脉冲源
求助:SL811HST读写U盘
三星接近与高通达成2纳米代工协议,随着晶圆代工业务复苏势头增强
10 亿营收+千人团队!宇树科技在机器人赛道杀疯了
Arm 驱动下一代机器人创新浪潮