| DSP的SPI对eeprom的接口函数 |
| |
| 作者:未知 来源:互联网 点击数:1054 更新时间:2007-2-7 |
|
您可以添加到网摘 让更多人关注此文章:
/*串行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; }
|
没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。 更多评论
|
|
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。 |
|
|
|