AT89C51ED2 + SPI........ |
缺席
|
killop
一般會員 發表:14 回覆:17 積分:11 註冊:2003-09-04 發送簡訊給我 |
各位大大
小弟目前正在研究用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 發送簡訊給我 |
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 波形) 不好意思!如有謬誤請直接修正,謝謝! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |