На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Передача данных по SPI , ATtiny2313
      Доброго всем дня!
      У меня возникла следующая проблема: пытаюсь передавать данные через SPI, но ничего не получается...Через вывод PB7 синхросигнал выходит, а данные никак не хотят...

      Вот примерный код программки (AVR Studio):
      ExpandedWrap disabled
        #include <avr/io.h>
        #include <util/delay.h>
         
        int main(void)
        {  
            DDRB  = 0xff;
            PORTB = 0b11000000;
            
            USIDR = 0b10101011;
         
            //USI Control Register - USICR
            //Bit 7   - USISIE   - Start Condition Interrupt Enable
            //Bit 6   - USIOIE   - Counter Overflow Interrupt Enable
            //Bit 5-4 - USIWM1:0 - Wire Mode
            //Bit 3-2 - USICS1:0 - Clock Source Select
            //Bit 1   - USICLK   - Clock Strobe
            //Bit 0   - USITC    - Toggle Clock Port Pin    
            USICR=0b00100010;
            
         
         
            //USI Status Register - USISR
            //Bit 7   - USISIF    - Start Condition Interrupt Flag
            //Bit 6   - USIOIF    - Counter Overflow Interrupt Flag
            //Bit 5   - USIPF     - Stop Condition Flag
            //Bit 4   - USIDC     - Data Output Condition
            //Bit 3-0 - USICNT3:0 - Counter Value
            USISR = 0b00000001;
         
            for (int i = 0; i<16; i++)
            {
                _delay_ms(50); //задержка для наглядности процесса)))
                USICR |= (1<<USITC);
            }  
            while(1)
            {
            
            }
        }


      Может я в программе что-то напудрил...Просто для 2313 по SPI в инете пока ничего нормального не нашел...Читал даташит, там вроде все написано, но я чесно говоря на английском не очень понял все нюансы...

      Заранее благодарен за помощь! :)
        appshneg, попробуй пример из даташита.
        Там на ассемблере, но если писать на С получится приблизительно так:
        ExpandedWrap disabled
          USIDR = 0xAB;
          USISR = USIOIF;
          for(;;)
          {
           USICR = USIWM0 | USICLK | USITC;
           if((USISR & USIOIF)==0)
           {
            // вероятно, зачистка
            USIDR;
            break;
           }
          }


        На сколько это близко к ассемблерному примеру можно понять, сгенерировав
        ассемблерный листинг твоей С-шной программы.
        Кроме того, этот исходник на С зависит от определений бит.
        В моём случае это:
        ExpandedWrap disabled
          /* UART I/O Data Register */
          sfrb UDR  = 0x0C;
           
          sfrb USICR = 0x0D;
          #define USISIE (1<<7)
          #define USIOIE (1<<6)
          #define USIWM1 (1<<5)
          #define USIWM0 (1<<4)
          #define USICS1 (1<<3)
          #define USICS0 (1<<2)
          #define USICLK (1<<1)
          #define USITC (1<<0)
           
          sfrb USISR = 0x0E;
          #define USISIF (1<<7)
          #define USIOIF (1<<6)
          #define USIPF (1<<5)
          #define USIDC (1<<4)
          #define USICNT3 (1<<3)
          #define USICNT2 (1<<2)
          #define USICNT1 (1<<1)
          #define USICNT0 (1<<0)
           
          sfrb USIDR = 0x0F;
        Сообщение отредактировано: ЫукпШ -
          ЫукпШ, спасибо за ответ:)
          Я еще хотел спросить: PB5 - in, PB6 - out, PB7 - out верно???
            Цитата appshneg @
            Я еще хотел спросить: PB5 - in, PB6 - out, PB7 - out верно???
            DDRB = 0xff;

            я думаю нет.
            DDRB определяет направление передачи порта.
            0 - (после сброса) in
            1 - out
            DDRB = 0xFF - все биты порта В на вывод.
              Все, вопрос решился :) Помог все-таки даташит :)

              Вот что у меня получилось:
              ExpandedWrap disabled
                unsigned char ch16 = 0b00000000;
                unsigned char ch17 = 0b00000000;
                 
                int main(void)
                {
                        ch16 = (1<<USIWM0)|(0<<USICS0)|(1<<USITC);
                    ch17 = (1<<USIWM0)|(0<<USICS0)|(1<<USITC)|(1<<USICLK);
                        ...
                        while(1);
                }
                 
                void SendSPIByte(unsigned char byte)
                {
                    //USI Control Register - USICR
                    //Bit 7   - USISIE   - Start Condition Interrupt Enable
                    //Bit 6   - USIOIE   - Counter Overflow Interrupt Enable
                    //Bit 5-4 - USIWM1:0 - Wire Mode
                    //Bit 3-2 - USICS1:0 - Clock Source Select
                    //Bit 1   - USICLK   - Clock Strobe
                    //Bit 0   - USITC    - Toggle Clock Port Pin    
                    USICR=0b00010010;
                        
                    //USI Status Register - USISR
                    //Bit 7   - USISIF    - Start Condition Interrupt Flag
                    //Bit 6   - USIOIF    - Counter Overflow Interrupt Flag
                    //Bit 5   - USIPF     - Stop Condition Flag
                    //Bit 4   - USIDC     - Data Output Condition
                    //Bit 3-0 - USICNT3:0 - Counter Value
                    USISR = 0b00000000;
                 
                    USIDR = byte;  
                    
                    for (int i = 0; i<16; i++) USICR = (i%2 == 0) ? ch16 : ch17;
                }
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0525 ]   [ 15 queries used ]   [ Generated: 2.05.24, 09:18 GMT ]