单片机/MCU论坛
直播中

慕楠

6年用户 7经验值
私信 关注
[问答]

程序下到c8051单片机中没有反应,这是为什么?

这是程序:#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);
}

          

已退回1积分

回帖(8)

慕楠

2018-7-3 16:43:18
本帖最后由 Defenders 于 2018-7-3 16:51 编辑

大神们,帮帮忙 ?已经折腾了好久,实在无能为力啊,void Timer2_Init();
void ADC_Init(),忘了删掉了
举报

chenwei6991627

2018-7-3 20:38:07
哪里要那么多死循环
举报

慕楠

2018-7-3 21:44:10
引用: chenwei6991627 发表于 2018-7-3 20:38
哪里要那么多死循环

电路想要实现:第一次上电向铁电写数据,第二次上电将数据读出来
举报

勇哥-lzu

2018-7-4 08:49:34
引用: Defenders 发表于 2018-7-3 21:44
电路想要实现:第一次上电向铁电写数据,第二次上电将数据读出来

先试一下,简单的读写有没有问题;然后再实现想要的逻辑;
举报

慕楠

2018-7-4 09:33:08
引用: 勇哥-lzu 发表于 2018-7-4 08:49
先试一下,简单的读写有没有问题;然后再实现想要的逻辑;

是啊 ,我这个程序就想试试简单的读写功能,但是一直调不出来
1 举报

勇哥-lzu

2018-7-4 20:40:59
引用: Defenders 发表于 2018-7-4 09:33
是啊 ,我这个程序就想试试简单的读写功能,但是一直调不出来

你的main函数中还有一些其他逻辑,先把这些逻辑去掉;循环写,看外部器件有没有反应;然后循环读,将数据从串口发出,看一下读的数据是否正确
举报

慕楠

2018-7-5 10:42:14
引用: 勇哥-lzu 发表于 2018-7-4 20:40
你的main函数中还有一些其他逻辑,先把这些逻辑去掉;循环写,看外部器件有没有反应;然后循环读,将数据从串口发出,看一下读的数据是否正确

好的 谢谢您 我试试看
举报

jinyi7016

2018-7-13 16:45:31
你可以先设置一下程序,只是点一个LED,看看会不会运行
举报

更多回帖

发帖
×
20
完善资料,
赚取积分