OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2886|回复: 2

stm读写93C46

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
42
金钱
42
注册时间
2014-12-29
在线时间
4 小时
发表于 2015-3-6 16:45:49 | 显示全部楼层 |阅读模式
5金钱
我在尝试用STM32读写93C46,但是都没成功,请大神门指点下,程序如下,从网上拿的51例子改的。
 
[mw_shl_code=c,true]#include "stm32f10x.h" #include "sys.h" #include "stdio.h" #include "public.h" #include "delay.h" //定义I/O #define CS PCout(4) #define SK PCout(5) #define DI PCout(6) #define DO PDin(3) //extern unsigned char ReadChar(unsigned char address); //extern void WriteChar(unsigned char address,unsigned char InData); //extern void ReadString(unsigned char data *RamAddress,unsigned char //RomAddress,unsigned char Number); //extern void WriteString(unsigned char data *RamAddress,unsigned char //RomAddress,unsigned char Number); // Write enable must precede all programming modes. void Ewen(void) { unsigned char temp,InData; CS=0; SK=0; Delay_us(1); CS=1; InData=0x98; // 10011XXXX for(temp=9;temp!=0;temp--) { // 9 if(InData>=0x80)DI=1; else DI=0; SK=1;Delay_us(1); SK=0;Delay_us(1); InData<<=1; } CS=0; } // Disables all programming instructions. void Ewds(void) { unsigned char temp,InData; CS=0; SK=0; Delay_us(1); CS=1; InData=0x80; // 10000XXXX for(temp=9;temp!=0;temp--) { // 9 if(InData>=0x80)DI=1; else DI=0; SK=1;Delay_us(1);SK=0; Delay_us(1); InData<<=1; } CS=0; } // Reads data stored in memory, at specified address. unsigned int Read(unsigned char address) { unsigned char temp; U16 result; Ewen(); SK=0;Delay_us(1); DI=1; // 110 A5-A0 CS=0; CS=1; address=address&0x3f|0x80; for(temp=8;temp!=0;temp--) { // 8 if(address>=0x80)DI=1; else DI=0; // DI=address&0x80; SK=1;Delay_us(1); SK=0;Delay_us(1); address<<=1; } SK=1;Delay_us(1); SK=0;Delay_us(1); // 1 DO=1; Delay_us(1); for(temp=16;temp!=0;temp--) { // 16 SK=1; Delay_us(1); result=(result<<1)|DO; SK=0; Delay_us(1); } CS=0; Ewds(); return(result); } // Writes memory location An - A0. void Write(unsigned char address,U16 InData) { unsigned char temp; Ewen(); Delay_us(5); // 101 A5-A0 CS=0; CS=1; DI=1; SK=0;Delay_us(1); address=(address&0x3f)|0x40; for(temp=8;temp!=0;temp--) { // 8 if(address>=0x80)DI=1; else DI=0; SK=1;Delay_us(1); SK=0; Delay_us(1); address<<=1; } for(temp=16;temp!=0;temp--) { // 16 if(InData>=0x8000)DI=1; else DI=0; SK=1;Delay_us(1); SK=0; Delay_us(1); InData<<=1; } SK=1; Delay_us(1); CS=0; DO=1; SK=0;Delay_us(1); // 1 CS=1; SK=1; Delay_us(1); while(DO==0) { // busy test SK=0; Delay_us(1); SK=1; Delay_us(1); } SK=0;Delay_us(1); CS=0; Delay_us(5); Ewds(); } /* // Erase memory location An - A0. void Erase(unsigned char address) { unsigned char temp; Ewen(); SK=0; DI=1; // 111 A5-A0 CS=0; CS=1; SK=1; SK=0; // 1 address|=0xc0; for(temp=8;temp!=0;temp--) { // 8 DI=address&0x80; SK=1; SK=0; address<<=1; } CS=0; DO=1; CS=1; SK=1; while(DO==0) { SK=0; SK=1; } SK=0; CS=0; Ewds(); } // Erases all memory locations. Valid only at VCC = 4.5V to 5.5V. void Eral(void) { unsigned char temp,InData; Ewen(); CS=0; SK=0; CS=1; InData=0x90; // 10010XXXX for(temp=9;temp!=0;temp--) { // 9 DI=InData&0x80; SK=1; SK=0; InData<<=1; } CS=0; DO=1; CS=1; SK=1; while(DO==0) { SK=0; SK=1; } SK=0; CS=0; Ewds(); } // Writes all memory locations. Valid only at VCC = 4.5V to 5.5V. void Wral(unsigned int InData) { unsigned char temp,address; Ewen(); CS=0; SK=0; CS=1; address=0x88; // 10001XXXX for(temp=9;temp!=0;temp--) { // 9 DI=address&0x80; SK=1; SK=0; address<<=1; } for(temp=16;temp!=0;temp--) { // 16 DI=InData&0x8000; SK=1; SK=0; InData<<=1; } CS=0; DO=1; CS=1; SK=1; while(DO==0) { SK=0; SK=1; } SK=0; CS=0; Ewds(); } */ //unsigned char ReadChar(unsigned char address) //{ // unsigned char temp=address>>1; // if(address&0x01) return((unsigned char)(Read(temp)>>8)); // else return((unsigned char)(Read(temp))); //} //void WriteChar(unsigned char address,unsigned char InData) //{ // unsigned char temp=address>>1; // if(address&0x01) Write(temp,(unsigned int)(Read(temp)&0x00ff|(InData<<8))); // else Write(temp,(unsigned int)(Read(temp)&0xff00|InData)); //} //void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) //{ // while(Number!=0) // { // *RamAddress=ReadChar(RomAddress); // RamAddress++; // RomAddress++; // Number--; // } //} //void WriteString (unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) //{ // unsigned int temp; // if(Number==0) return; // if(RomAddress&0x01) // { // WriteChar(RomAddress,*RamAddress); // RamAddress++; // RomAddress++; // Number--; // } // if(Number==0) return; // while(Number>>1) // { // temp=*RamAddress; // RamAddress++; // temp=temp|(*RamAddress)<<8; // RamAddress++; // Write(RomAddress>>1,temp); // RomAddress++; // RomAddress++; // Number--; // Number--; // } // if(Number) // { // WriteChar(RomAddress,*RamAddress); // } //}[/mw_shl_code]


 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-6 22:53:30 | 显示全部楼层
回复

使用道具 举报

172

主题

539

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3449
金钱
3449
注册时间
2015-10-5
在线时间
492 小时
发表于 2016-6-18 10:46:39 | 显示全部楼层
请问你成功了吗?可以吧程序发我一份吗,急用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 05:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表