реклама на сайте
подробности

 
 
> Покритикуйте SPI для AT45Dxxx, MSP430 & SPI
Lucky:)
сообщение Feb 14 2007, 09:05
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 5-10-06
Пользователь №: 21 031



Покритикуйте пожалуйста .
Не пойму в чём причина не читания AT45Dx.
получаю идентификационный номер памяти без проблем.
Начинаю читать, происходит следующее - или все "0" или "FF", или вообще не останавливается цикл чтения.

Код
// Чтение 16 байт из AT45Dx Memory Test

//******************************************************************************
//                                                    
//             AT45DX     Slave           MSP430F169 Master
//             -----------------          -----------------
//            |                 |     /|\|              XIN|-
//            |                 |      | |                 |
//            |                 |      --|RST          XOUT|-
//            |                 |        |             P1.0|-> LED
//            |              SI |<-------|P3.1/SIMO0       |
//            |              SO |------->|P3.2/SOMI0       |
//            |             CLK |<-------|P3.3/UCLK0       |
//            |                 |        |                 |
//            |           CS#   |<-------|P5.1             |
//            |        RESET#   |<-------|P5.2             |
//
//******************************************************************************

#include  <msp430x16x.h>

#define LED_ON    (P1OUT |= BIT0)
#define LED_OFF   (P1OUT &= ~BIT0)
#define MEM_RES0            (P5OUT &= ~BIT2)    
#define MEM_RES1            (P5OUT |= BIT2)    
#define CS_0            (P5OUT &= ~BIT1)    
#define CS_1            (P5OUT |= BIT1)    

volatile char akn;
volatile char bufSOMI[32];
volatile char bufSOMICnt = 0;
volatile char readAT45D = 0;       // 1 = progress

void init_spi();
void AT45DXReset();
void AT45DXManufactureID();
void readAT45DX();


//*********************************************************
// main()
// UART0
//*********************************************************
int main(void)
{
  volatile unsigned int i;

  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog
  P1DIR |= BIT0;                            // Установка вывода для LED output
  init_spi();
  IE1 |= URXIE0 + UTXIE0;                   // Разрешить RX и TX прерывания
  //Memory Reset
  CS_1;
  AT45DXReset();
  CS_0;
  _BIS_SR(GIE);                             // Разрешить прерывания
  while ((IFG1 & UTXIFG0) == 0);            // USART0 TX буфер готов получить новые данные?
  AT45DXManufactureID();
  while(1){
    LED_ON;
    readAT45DX();
  }    
}

#pragma vector=USART0RX_VECTOR
__interrupt void SPI0_rx (void)
{
  while ((U0TCTL&TXEPT)!= TXEPT);             // USARTo TX пустой?

  if(readAT45D == 1){                        // идёт чтение из АТ45?
    bufSOMI[bufSOMICnt] = RXBUF0;            // запись данных в буфер
    bufSOMICnt++;                           // увеличиваем счётчик
  }
  
  akn = RXBUF0;                                // подтверждение от АТ45
  
}

#pragma vector=USART0TX_VECTOR
__interrupt void SPI0_tx (void)
{
  _NOP();
  if(readAT45D == 1){                        // идёт чтение из АТ45?
    // dumn data
    TXBUF0 = 0x00;                            // выпихиваем данные из АТ45
  }

}

//*********************************************************
// инициализация SPI
//*********************************************************
void init_spi(){
  
  P3SEL |= 0x0E;                            // P3.1,2,3 SPI для SPI
  P3DIR |= BIT1;                            // P3.1 установить SIMO output
  P3DIR |= BIT3;                            // P3.3 установить CLK output
  P5DIR |= BIT1;                            // P5.1 установить CS# output
  P5DIR |= BIT2;                            // P5.2 установить Reset# output
  
  
  U0CTL = CHAR + SYNC + MM + SWRST;         // 8-bit, SPI, Master
  U0TCTL = CKPL + SSEL1 + STC;              // Полярность, SMCLK, 3-wire

  U0BR0 = 0x02;                             // SPICLK = SMCLK/2
  U0BR1 = 0x00;
  U0MCTL = 0x00;
  ME1 |= USPIE0;                            // Module enable
  U0CTL &= ~SWRST;                          // SPI enable
}
    
//*********************************************************
// Сброс АТ45
//*********************************************************
void AT45DXReset(){
  MEM_RES0;                                        // установить в 0
  for (int i = 0x7F; i > 0; i--);              // временная задержка
  MEM_RES1;                                        // установить в 1
}


//*********************************************************
// Получить идентификационный номер
//*********************************************************
void AT45DXManufactureID(){
  AT45DXReset();                                // сброс
  while ((U0TCTL&TXEPT)!= TXEPT);                // ожидание пока ТХ буфер не пуст
  TXBUF0 = 0x9F;                                // отправить комманду
  while ((U0TCTL&TXEPT)!= TXEPT);
  TXBUF0 = 0x00;
  while ((U0TCTL&TXEPT)!= TXEPT);
  TXBUF0 = 0x00;
  while ((U0TCTL&TXEPT)!= TXEPT);
  TXBUF0 = 0x00;
}


//*********************************************************
// чтение АТ45
// прочитать 16 байт из AT45DX с адреса 0 до 15
// и сохрантить их в bufSOMI[]
//*********************************************************
void readAT45DX(){

  AT45DXReset();                                // сброс

  while ((U0TCTL&TXEPT)!= TXEPT);
  bufSOMICnt = 0;                                // обнулить счётчик
  TXBUF0 = 0x03;                                // отправить комманду
  while ((U0TCTL&TXEPT)!= TXEPT);
  TXBUF0 = 0x00;                                // отправить адрес
  while ((U0TCTL&TXEPT)!= TXEPT);
  TXBUF0 = 0x00;
  while ((U0TCTL&TXEPT)!= TXEPT);
  readAT45D = 1;                                // чтение по прерыванию начинается тут.
  TXBUF0 = 0x00;
  while(bufSOMICnt<=0x0F){                        // дождаться пока 16 байт запушутся в буфер
    _NOP();
  };
  readAT45D = 0;                                // чтение по прерыванию заканчивается тут.
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 13:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016