完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是程序:#include
#include "compiler_defs.h" #include "C8051F520A_defs.h" // FRAM25V10功能定义 =============================== #define WRITE 0x02 // 写内存空间 #define READ 0x03 // 读内存空间 #define WRDI 0x04 // 写禁止 #define WREN 0x06 // 设置写使能锁存 //============================================================== //other #define SYSCLK 24500000 //定义系统始终24.5MHz #define BAUDRATE 57600 //baud rate #define SPI_CLOCK 2450000 //================================================================================ // 端口定义 ================================================================= ***it tx=P0^4; // 输出,回读数据口 ***it cs1=P1^7; // 输出,铁电1片选 ***it cs2=P2^2; //输出,铁电2片选 ***it write_or_read=P1^0; ***it choose_fram=P0^7; //读铁电 //=============================================== //初始化部分 void timer2_Init(); void ADC_Init(); void Port_IO_Init() ; void Oscillator_Init(); //void Timer1_Init(); void UART0_Init(); void SPI_Init() ; void Init_Device() ; //============================================================ //SPI读写部分 void SPI_transfer(unsigned char SPI_byte); char SPI_read(void); //======================================================= //fram读写部分 void fram_start_write() ; void fram_start_read() ; //============================================== //延时子程序 void delay_ms(unsigned int xms); //==================================== void main() { unsigned char j; PCA0MD &= 0xBF; // 关闭看门狗定时器 Init_Device(); delay_ms(100); for ( j = 0; j < 3; j++) { while(write_or_read==0) { fram_start_read(); while(1); } delay_ms(100); } //write start fram_start_write(); while(1); } void delay_ms(unsigned int xms) { unsigned int i,j; for(i=xms;i>0;i--) for(j=260;j>0;j--); // 1.02s } //各初始化================================== void Init_Device(void) { Port_IO_Init(); Oscillator_Init(); SPI_Init(); UART0_Init(); } void Port_IO_Init() //done { P0MDIN = 0xFF; // P0端口都是数字输入 P0MDOUT = 0x10; // P0.4 P1MDIN = 0xF1; // P1.1 ,P1.2,P1.3模拟输入 P1MDOUT = 0xD0; // P1.4-SCK,P1.6-MOSI,P1.7-CS 推挽输出 P2MDIN = 0xFF; // P2端口都是数字输入 P2MDOUT = 0x04; //P2.2-CS 推挽输出 P3MDIN = 0xFF; P3MDOUT = 0x00; P0SKIP = 0xCF; // 端口0跳过引脚 P1SKIP = 0x0F; // 端口1跳过引脚 P2SKIP = 0xFF; // 端口2跳过引脚 XBR0 = 0x05; // UART,SPI连到端口引脚 XBR2 = 0x40; // 使能交叉开关,弱上拉使能 } void Oscillator_Init() //done { OSCICN = 0xC7; // 允许内部振荡器,不分频,24MHz } // SBCON0 =0x43; // SBRLL0 =0x30; // SBRLH0 =0xFF; //} // UART0的初始化子程序结束 57600 void UART0_Init() { SCON0=0x10; if (SYSCLK/BAUDRATE/2/256 < 1) { TH1 = -(SYSCLK/BAUDRATE/2); CKCON |= 0x10; // T1M = 1; SCA1:0 = xx } else if (SYSCLK/BAUDRATE/2/256 < 4) { TH1 = -(SYSCLK/BAUDRATE/2/4); CKCON |= 0x01; // T1M = 0; SCA1:0 = 01 CKCON &= ~0x12; } else if (SYSCLK/BAUDRATE/2/256 < 12) { TH1 = -(SYSCLK/BAUDRATE/2/12); CKCON &= ~0x13; // T1M = 0; SCA1:0 = 00 } else { TH1 = -(SYSCLK/BAUDRATE/2/48); CKCON |= 0x02; // T1M = 0; SCA1:0 = 10 CKCON &= ~0x11; } TL1 = 0xff; // set Timer1 to overflow immediately TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload TMOD |= 0x20; TR1 = 1; // START Timer1 TI0 = 1; } void SPI_Init() { SPI0CFG =0x40; // 允许主方式,在SCK的第一个边沿采样数据,SCK在空闲时处于低电平 SPI0CN =0; // 暂且禁止SPI0 SPI0CKR =0; ESPI0 = 0; // disable SPI interrupts // SPI0CKR=(SYSCLK/(2*SPI_CLOCK))-1; // SPI clock frequency equation from the datasheet } void fram_start_write() { unsigned char i; SPI_Init(); SPIEN=1; cs1=1; cs2=1; cs1=0; cs2=0; SPI_transfer(WREN); cs1=1; cs2=1; cs1=0; cs2=0; SPI_transfer(WRITE); SPI_transfer(0x00); //开始地址 SPI_transfer(0x00); SPI_transfer(0x00); for(i=10;i>0;i--) //要写的东西 { SPI_transfer(0xAA); SPI_transfer(0xBB); SPI_transfer(0x00); SPI_transfer(0x01); } cs1=1; cs2=1; cs1=0; cs2=0; SPI_transfer(WRDI); cs1=1; cs2=1; } void fram_start_read() { unsigned char k; while(choose_fram==1) //fram 1 { SPI_Init() ; SPIEN=1; TR1=1; cs1=1; cs1=0; SPI_transfer(READ); SPI_transfer(0x00); // 首地址 00000H SPI_transfer(0x00); SPI_transfer(0x00); for(k=0;k<10;k++) { TI0 = 0; SBUF0 = SPI_read(); // 发送8位数 while(!TI0); TI0 = 0; } cs1=1; TR1=0; } } void SPI_transfer(unsigned char SPI_byte) { SPI0DAT=SPI_byte; while(TXBMT==0); SPIF=0; while(SPIF==0); SPIF=0; } char SPI_read() { SPIF=0; SPI0DAT=0xFF; while(SPIF==0); SPIF=0; return(SPI0DAT); } |
|
相关推荐
8个回答
|
|
本帖最后由 Defenders 于 2018-7-3 16:51 编辑
大神们,帮帮忙 ?已经折腾了好久,实在无能为力啊,void Timer2_Init(); void ADC_Init(),忘了删掉了 |
|
|
|
哪里要那么多死循环
|
|
|
|
|
|
|
|
先试一下,简单的读写有没有问题;然后再实现想要的逻辑; |
|
|
|
|
|
|
|
你的main函数中还有一些其他逻辑,先把这些逻辑去掉;循环写,看外部器件有没有反应;然后循环读,将数据从串口发出,看一下读的数据是否正确 |
|
|
|
好的 谢谢您 我试试看 |
|
|
|
你可以先设置一下程序,只是点一个LED,看看会不会运行
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-移植前准备之git管理内核源码
1927 浏览 0 评论
【瑞萨RA2L1入门学习】+ MacOS安装e2studio
786 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-本地仓库管理之分支间的操作
817 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】3D 图形显示
686 浏览 0 评论
761 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12256 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-5 00:56 , Processed in 0.817703 second(s), Total 89, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号