Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > SPI на AT89C5131


Автор: CROC 4.8.2006, 21:38
в том виде в каком сейчас существует мой код у меня программа не заходит в прерывание spi
Код

/*############## Настройка SPI ###########*/

P1_4 = 1;  /*LDAC*/
P1_1 = 1;  /*разрешение master*/

/*=============== 1101 1110 ===============*/
SPCON = 0x00;  /*сброс режимов spi*/

SPCON |= 0x10; /*---1 ----  ---1 ---- режим (1=мастер/0=слейв)*/  
SPCON |= 0x82; /*1--- --1-  1--1 --1- частота spi (11=128)*/
SPCON |= 0x08; /*---- 1---  1--1 1-1- полярность (1=)*/
SPCON |= 0x04; /*---- -1--  1--1 111- фронт (1=)*/
IEN1 |= 0x04; /*разрешить прерывание spi*/
SPCON |= 0x40; /*-1-- ----  11-1 111- запуск spi (1=start)*/

transmit_complited=0;
data_ex = 0x55;

LED0=0;
LED1=0;
LED2=0;
LED3=0;
i=0;

TR0=1; /*timer0 run*/

 /* основной цикл программы */
while(1) 
   {
    } /*END WHILE*/
}

interrupt void timer0_int()
{
LED0 = ~LED0;
i++;    
TF0 = 0;
 /*сброс флага прерывания*/

TH0 = 0x00;
TL0 = 0x00; 

  if (i==1) 
    {
          LED1 = ~LED1;
      i = 0;
      j++;


SPDAT = data_ex;
          while (transmit_complited==0)
          LED2 = 1;
          transmit_complited=0;

SPDAT = j;
          while (!transmit_complited);
          transmit_complited=0;
for (h=0;h<4;h++) P1_4 = 0;
                   P1_4 = 1;

     /* data_ex = ~data_ex;*/

    }
TR0=1; /*timer0 run*/
}

interrupt void spi_modf_int()
   {
     LED3 = 1;
     switch (SPSTA)
     {
       case 0x80:
         transmit_complited=1;  
       break;  
       
       case 0x10:
       break;    
       
       case 0x40:
       break;    
      }
   }


и какое прерывание использовать spi_spif_int или spi_modf_int ?? ни с тем, ни с тем не получается smile

может кините, что-то из своего?

Автор: cardinal 4.8.2006, 22:09
Вот одна фишка есть. Разбирайся...
Код

void SPIInit(void)
{                                           
   // spi settings

   SPCON = 0x71;
   SPDAT = 0x55;
}

void SendSPI(xdata char * data pchBuf, char chNum) _naked
{   
   chNum;
   pchBuf;                                
   _asm                         
   mov r1, _SendSPI_PARM_2              
00103$:                    
   movx a, @dptr
   mov _SPDAT, a
   inc dpl
   dec r1
   cjne r1, #0x00, 00103$
   ret
  _endasm; 
}   


Автор: CROC 6.8.2006, 12:53
Цитата(cardinal @ 4.8.2006,  22:09)
Вот одна фишка есть. Разбирайся...

спасибо,
но все самое интересное на асемблере smile
и еще не используется прерывания связанные с spi
и еще, хоть скажите для чего (какие действия делает) эта подпрограммка была сделана, так мне в асемблере проще будет разобраться

Автор: cardinal 6.8.2006, 14:50
Цитата(CROC @  6.8.2006,  11:53 Найти цитируемый пост)
и еще, хоть скажите для чего (какие действия делает) эта подпрограммка была сделана

Ну так имена функций вроде все объясняют сами. Первая инициализирует SPI, вторая посылает по SPI данный из буффера, на который показывает pchBuf, которых chNum штук. Да и вообще тут просто цикл сделан, а так
Код

void SendSPI(char a)
{   
   ...
  SPDAT = a
   ...
}   

Больше я ничего особенного не делал.

Автор: CROC 6.8.2006, 20:54
я вроде разобрался с просто передачей (в цикле по таймеру), но в таком случае не все так идеально как бы мне хотелось
а вот никак не могу получить прерывание от spi по окончанию передачи байта smile по которому бы я послал следующий

Автор: cardinal 6.8.2006, 22:09
Этого не знаю...

Автор: CROC 6.8.2006, 23:06
жаль

Автор: CROC 10.8.2006, 20:06
решил с перываниями не работать
на самой большой скорости возможно передавать байты с перерывам в 10 маш.команд так что я думаю найду чем занять процессор в это время smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)