这是程序:#include <intrins.h>
#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
//================================================================================
// 端口定义 =================================================================
sbit tx=P0^4; // 输出,回读数据口
sbit cs1=P1^7; // 输出,铁电1片选
sbit cs2=P2^2; //输出,铁电2片选
sbit write_or_read=P1^0;
sbit 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);<
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
电路想要实现:第一次上电向铁电写数据,第二次上电将数据读出来
是啊 ,我这个程序就想试试简单的读写功能,但是一直调不出来
你的main函数中还有一些其他逻辑,先把这些逻辑去掉;循环写,看外部器件有没有反应;然后循环读,将数据从串口发出,看一下读的数据是否正确
好的 谢谢您 我试试看
一周热门 更多>