線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2924
推到 Plurk!
推到 Facebook!

AT89C51ED2 + SPI........

缺席
killop
一般會員


發表:14
回覆:17
積分:11
註冊:2003-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-10 01:04:28 IP:140.116.xxx.xxx 未訂閱
各位大大 小弟目前正在研究用8051來作SPI傳輸 找了一顆MCU - AT89C51ED2 ATMEL的datasheet如下 http://www.atmel.com/dyn/products/product_card.asp?part_id=3045 在這個網頁下有C的SPI範例 我看了看 有點疑惑 所以想請問各位
/**
* @file $RCSfile: spi_master_ss.c,v $
*
* Copyright (c) 2004 Atmel.
*
* Please read file license.txt for copyright notice.
* @brief This file is an example to use spi in master mode.
* This file can be parsed by Doxygen for automatic documentation
* generation.
* Put here the functional description of this file within the software
* architecture of your program.
* @version $Revision: 1.0 $ $Name: $
*/
/* @section I N C L U D E S */    #include "reg_c51.h"
char serial_data;
char data_example=0x55;
char data_save;
bit transmit_completed= 0;    /**
* FUNCTION_PURPOSE: This file set up spi in master mode with
* Fclk Periph/128 as baud rate and with slave select pin.
* FUNCTION_INPUTS: P1.5(MISO) serial input
* FUNCTION_OUTPUTS: P1.7(MOSI) serial output
*/    void main(void)
{
  SPCON |= 0x10;        /* Master mode */
  P1_1=1;               /* enable master */
  SPCON |= 0x82;        /* Fclk Periph/128 */
  SPCON &= ~0x08;       /* CPOL=0; transmit mode example */
  SPCON |= 0x04;        /* CPHA=1; transmit mode example */
  IEN1 |= 0x04;         /* enable spi interrupt */
  SPCON |= 0x40;        /* run spi */
  EA=1;                 /* enable interrupts */      while(1)              /* endless */
  {
    SPDAT=data_example;        /* send an example data */
    while(!transmit_completed);/* wait end of transmition */
    transmit_completed = 0;    /* clear software transfert flag */        SPDAT=0x00;                /* data is send to generate SCK signal */
    while(!transmit_completed);/* wait end of transmition */
    transmit_completed = 0;    /* clear software transfert flag */
    data_save = serial_data;   /* save receive data */
  }
}    /**
* FUNCTION_PURPOSE:interrupt
* FUNCTION_INPUTS: void
* FUNCTION_OUTPUTS: transmit_complete is software transfert flag
*/    void it_SPI(void) interrupt 9 /* interrupt address is 0x004B */
{
  switch( SPSTA ) /* read and clear spi status register */
  {
    case 0x80:
        serial_data=SPDAT;     /* read receive data */
        transmit_completed=1;  /* set software flag */
        break;        case 0x10:
    /* put here for mode fault tasking */
        break;
    case 0x40:
    /* put here for overrun tasking */
        break;
  }
}
因為我想用51來控制SD卡 所以我選用Master with Slave Select的code 前面程式碼大致沒有問題 只是SPDAT=0x00;/* data is send to generate SCK signal */ 這段之後看不太懂 這是說SPDAT如果是0x00的話 那51會產生SCK訊號 讓Slave端回傳資料嗎? 我看AT89C51ED2的datasheet沒講到SPDAT如果放0x00會怎樣 另外它的中斷有檢查SPSTA暫存器 0x80指SPIF - Serial Peripheral Data Transfer Flag為1 Set by hardware to indicate that the data transfer has been completed. 這裡的data transfer是指傳送 接收嗎?? 我現在的問題是不清楚他接收完畢與傳送完畢的中斷動作是在哪?
ssejack
高階會員


發表:87
回覆:143
積分:106
註冊:2005-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-16 00:47:50 IP:218.168.xxx.xxx 未訂閱
Hi Killop :          我沒用過AT89C51ED2,但您說的問題由類似的 MCU 看來,可能答案如下:
引言: 我看AT89C51ED2的datasheet沒講到SPDAT如果放0x00會怎樣
第一次 WRITE DATA TO SPDAT (SPDAT=data_example) 是將 原 SHIFT REGISTER 中的資料 SHIFT 出去,並將 data_example 存入 SHIFT REGISTER 中; 第二次 WRITE DATA TO SPDAT (SPDAT=0x00) 是將 SHIFT REGISTER 中的資料( data_example ) SHIFT 出去,並將 0X00 存入 SHIFT REGISTER 中, 故如沒作第二次(SPDAT=0x00)時 data_example 是送不出去的!
引言: 另外它的中斷有檢查SPSTA暫存器 0x80指SPIF - Serial Peripheral Data Transfer Flag為1 Set by hardware to indicate that the data transfer has been completed. 這裡的data transfer是指傳送 接收嗎?? 我現在的問題是不清楚他接收完畢與傳送完畢的中斷動作是在哪?
Interrupt 是接收到資料後發生的!當接收完成且無誤後硬體自動設定 SPSTA 中的 SPIF即(0X80). 故流程大略為: SEND 0X00 -> SEND 0X55 -----> SEND 0X00 -> SEND 0X55 -----> . . . RECEIVE DATA (SET SPIF=1) ---> INT---> 儲存資料 (serial_data=SPDAT) . . SEND 0X00 -> SEND 0X55 無窮迴圈. 我想您用模擬器 STEP_RUN 應可驗證 ( 看 SCK & MOSI 波形) 不好意思!如有謬誤請直接修正,謝謝!
系統時間:2024-07-02 1:31:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!