注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
大能苗的个人空间 https://home.eeworld.com.cn/space-uid-423121.html [收藏] [复制] [分享] [RSS]
日志

IAR仿真问题

热度 1已有 4129 次阅读2012-7-29 18:07

刚把程序给调过了,设置也改成如下图所示:



在release模式下的仿真,仿真时也能进入仿真界面,但是源程序窗口不显示程序执行到哪儿了(小箭头),只在dissembly里面执行完main的前几句就卡在spi_send_byte了,求高手指点!
  

这是刚开始时的      

这是卡住时的
这是一个电力线载波的程序,连接为:

电力线<——>电力线载波调制解调芯片<——>SPI通信<——>mega16<——>UART通信<——>PC

如果是程序有错,也希望能不吝赐教!

源程序如下:


/*******************************************************************************
* Filename:     main.c
* Description:  This program acts as a bridge from SPI to PC and PC
*               to SPI.
* Note:         
*******************************************************************************/

#include <iom16.h>
#include <stdbool.h>
#include <string.h>
#include "UART.h"
#include "SPI.h"
/*------------------------------------------------------------------------------
  Global variables declaration
------------------------------------------------------------------------------*/
extern unsigned char UART_tx_buffer[UART_TX_BUFFER_SIZE];
extern unsigned char UART_tx_wr_index,UART_tx_rd_index,UART_tx_counter;
extern unsigned char UART_rx_buffer[UART_RX_BUFFER_SIZE];
extern unsigned char UART_rx_wr_index,UART_rx_rd_index,UART_rx_counter;
extern unsigned char Uart_RecvFlag,UART_rx_counter_temp;

extern unsigned char SPI_rx_buffer[SIZE];
extern unsigned char SPI_tx_buffer[SIZE];
extern unsigned char SPI_rx_wr_index,SPI_rx_rd_index,SPI_rx_counter,SPI_rx_buffer_overflow;
extern unsigned char SPI_tx_wr_index,SPI_tx_rd_index,SPI_tx_counter;
extern unsigned char SPI_free,SPI_RecvFlag;
extern void spi_tx_packet(void);
unsigned char mode_state;



/*******************************************************************************
* Name:         delay_ms(unsigned int n)
* Description:  delay ms.
* Parameters:   n.
        
*******************************************************************************/

void delay_ms(unsigned int n)                     //---->ms延时函数
{
  unsigned int i;
  while(n--)
  {
    for(i=1333;i>0;i--) asm("nop");                                 //1时钟周期
  }
}
//时钟16MHz 周期62.5ns

/*******************************************************************************
* Name:         uart_to_spi(void)
* Description:  Transmits the bytes from  uart buffer to spi buffer.

*******************************************************************************/
void uart_to_spi(void)
{
     
      while(SPI_tx_counter >= SIZE);                  //SPI发送缓冲区满,等待
      
       __disable_interrupt();
      if(Uart_RecvFlag)
      {                                               //数据包接收完成
        while(UART_rx_counter && (SPI_tx_counter <= UART_RX_BUFFER_SIZE))
        {
            SPI_tx_buffer[SPI_tx_wr_index] = UART_rx_buffer[UART_rx_rd_index];
            UART_rx_counter--;
            SPI_tx_counter++;
            INCR(SPI_tx_wr_index,SIZE);
            INCR(UART_rx_rd_index,UART_RX_BUFFER_SIZE);
        }
      }
      
       __enable_interrupt();
}

/*******************************************************************************
* Name:         spi_to_uart(void)        
* Description:  Transmits the bytes from spi buffer to uart buffer.      
*******************************************************************************/
void spi_to_uart(void)
{
  while(UART_tx_counter >= UART_TX_BUFFER_SIZE);                   //UART发送缓冲区满,等待
  
  if(SPSR & (1 << SPIF))
  {
       while(SPI_rx_counter && (UART_tx_counter < UART_TX_BUFFER_SIZE)) //SPI接收缓冲区有数且UART发送缓冲区未溢出
       {
        UART_tx_buffer[UART_tx_wr_index] = SPI_rx_buffer[SPI_rx_rd_index]; //将SPI接收到的byte移至UART发送缓冲区
              
        __disable_interrupt();
        SPI_rx_counter--;
        UART_tx_counter++;
        INCR(SPI_rx_rd_index,SIZE);
        INCR(UART_tx_wr_index,UART_TX_BUFFER_SIZE);
        __enable_interrupt();                                 
       }
   }
}

/*******************************************************************************
* Name:         main()        
* Description:  Main function.
* Parameters:   None.
* Return:       Exit code (should never return).
* Note:         
*******************************************************************************/
   
void main(void)
{
  
    delay_ms(50);
    mode_state = 0x00;
    static unsigned char configuration[3] = {0xA3,0x11,0xBA};
   
     __disable_interrupt();
      
    // Initialize SPI port.
    spi_init();
   
    // Initialization of Serial port.
    uart_init();
   
    // Initialize interrupts (SPI interrupt is mandatory for PLM-1 configuration).
    //int_init();   
   
   
    // Initialization of ST7538 with configuration Bytes.
    unsigned char i;
    mode_CR_wr();
    for(i=3;i>0;i--) spi_send_byte(configuration);
   
     __enable_interrupt();
      
    while(1)                                                   
    {
        /* Powerline -> RS232 */
      
        //从电力线接收数据
        mode_data_rx();                                          //进入数据接收模式
        if(carrier_appear)
        {                   //载波出现
           PORTB |= 0x08;   //则CD/PD被置0,进而将nSS拉低
           SPDR = to_read_byte;
           if(SPI_RecvFlag)                  // 传输完成则进入中断,直到一个数据包接收完成   
           spi_to_uart();
           if(UART_tx_counter)
           uart_tx_packet();
        }
        else
           PORTB &= 0xF7;                   //载波消失,nSS置位
            
      
       /* RS232 -> Powerline */
   
        if(Uart_RecvFlag)                               //UART接收完成
        {
           /* Get received packet from PLM-1 library. */
         
           if(UART_rx_counter) uart_to_spi();       //发送uart接收到的数据到spi_tx_buffer
           mode_data_tx();                             //数据发送
           if(SPI_tx_counter)
           {
             spi_tx_packet();
           }
         
      }   
    }
}

本文含有来自论坛的附件或图片点击查看原帖附件。

发表评论 评论 (1 个评论)
回复 wscwjya 2018-5-6 15:31
你好!这是电力线载波通信模拟软件么

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章