Обсуждаем контроллеры компании Atmel.
Ответить

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пт июл 07, 2023 16:15:53

Код:
for (i = 0; i < 5; i++) {
  master_arr[i] = SPDR;
  SPDR = master_arr[i];
}

Это тоже сомнительно. Какова цель? Как:
a = b;
b = a;

И есть еще одна необъявленная в декларации номер для массива (i = 0..4!) соотв. volatile unsigned char master_arr [4];
и соответственно - хаотичное значение (master_arr [4]) при i = 4.
Последний раз редактировалось veso74 Пт июл 07, 2023 16:23:25, всего редактировалось 3 раз(а).

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пт июл 07, 2023 16:21:45

a797945, ну тогда так получается: fG = (master_arr[1])|(master_arr[2] << 8)|(master_arr[3] << 16);

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пт июл 07, 2023 16:32:42

veso74, Какова цель? - отладка, человек хочет увидеть, что слейв все принял верно, на мастере он и не ловит ответ.
warptred12
да. наконец то. сами посмотрите где младший байт частоты до передачи, и куда вы его помещаете при приеме и склейке.
коли транспорт заработал, включите SPI на полную скорость, проверьте - не спотыкается ли.
да и надо переходить на целевой МК, т.е. на чем будете собирать - что бы работал и там.

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пт июл 07, 2023 16:53:15

a797945, я не понимаю как и где мне его посмотреть, когда я принимаю полученные байты на слейве - я присваиваю их значение элементам массива master_array и отправляю присвоенные значения обратно, а потом уже склеиваю их в переменной fG, эти элементы массива я никак не меняю, но при передаче этих элементов массива, отправленные данные я никак не изменяю, тогда почему они приходят на мастера со сдвигом?

Добавлено after 4 minutes 54 seconds:
veso74, я отправляю значения элементов массива обратно, чтобы увидеть на SPI анализаторе что я сохранил в эти элементы массивов.
Да увидел ошибку с for, там действительно должно быть 4, спасибо. Но ничего не изменилось, все так же сдвигает данные почему-то.

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пт июл 07, 2023 17:38:45

"почему они приходят на мастера со сдвигом?"
нет там сдвига.
не понимаете, потому, что торопитесь. медленно продумайте что я сказал про SPI.
когда слейв принимает 1-й байт от мастера из слейва в мастер уходит случайное состояние его сдвигового регистра. не торопясь прокрутите в голове такой мультик.
а 4-й байт слейв хоть и записывает в DR уже уйти не может - мастер свой 4-й отослал и передачу больше не тактирует. перечитайте не торопясь - думаю поймете.

Добавлено after 32 minutes 54 seconds:
warptred12, " я не понимаю как и где мне его посмотреть"

я про это:
мастер
...
unsigned long int w ; // w as WORD
unsigned int h[2]; // h as HALF-WORD
unsigned char b[4]; // b as BYTE
...
dFi.w = F*167.77216;
...
SPI_MasterTransmit(Cnt & 0x03);
SPI_MasterTransmit(dFi.b[0]);
SPI_MasterTransmit(dFi.b[1]);
SPI_MasterTransmit(dFi.b[2]);
...

здесь где младший байт частоты?

слейв
...
for(i=0;i<4;i++) {
master_arr[i] = SPDR;
...
nG = master_arr[0]
fG = 0|(master_arr[1] << 8 )|(master_arr[2] << 16)|(master_arr[3] << 24);
...

видите: то что было в dFi.b[0] вы размещаете в fG сдвинув на 8 бит старше

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Сб июл 08, 2023 08:13:28

сразу не посмотрел код, теперь забираю свои слова, что транспорт работает - код не рабочий.
если и сделал вид, вероятно это закидоны протеуса, в "железе" корректно работать не будет.
чой-то народ не среагировал на это безобразие:

interrupt [SPI_STC] void spi_isr(void)
{
unsigned char i=0;
for(i=0;i<5;i++) {
master_arr[i] = SPDR;
SPDR = master_arr [i];
}
}
и отсутствие очистки флага SPIF перед разрешением прерывания.

можно поправить, но предлагаю отказаться от прерывания на spi.
попробуйте так принять пачку:

unsigned char b1,b2,b3,b4;
while(PINB.2==1) // висим пока 1, как 0 идем дальше
while(!(SPSR & (1<<SPIF)));// висим пока 0, как 1 идем дальше
b1 = SPDR;
while(!(SPSR & (1<<SPIF)));
b2 = SPDR;
while(!(SPSR & (1<<SPIF)));
b3 = SPDR;
while(!(SPSR & (1<<SPIF)));
b4 = SPDR;

// nG = b1 & 0x03; //пока опустим
fG = 0 |b2 | (b3<<8)| (b4<<16);

// возвращаем его пропустив байт
while(!(SPSR & (1<<SPIF)));
SPDR = (char)(fG&0xFF);
while(!(SPSR & (1<<SPIF)));
SPDR = (char)((fG>>8)&0xFF);
while(!(SPSR & (1<<SPIF)));
SPDR = (char)((fG>>16)&0xFF);
while(!(SPSR & (1<<SPIF)));
SPDR = (char)((fG>>24)&0xFF);

а в мастере допишите строчки (просто чтоб увидеть возврат fG)
...
SPI_MasterTransmit(dFi.b[2]);
SPI_MasterTransmit(0xff); //пустышка
SPI_MasterTransmit(0xff); // младший байт
SPI_MasterTransmit(0xff); // 2
SPI_MasterTransmit(0xff); // 3
SPI_MasterTransmit(0xff); // старший
PORTB |= (1<<PORTB0);
...


по хорошему б : генерацию таймерами аппаратно, ядро в сон, будить по PINB.2==0.
но как это на avr я не знаю.

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 08:44:06

a797945, некоторые байты просто не записываются, скриншот приложу. Так же протеус ругается PC=0x0136 SPDR Write collision. Written data(0xFF) is ignored. Это опять слейв шлет обратно мусорные байты в регистр данных или данные просто не сохраняются в определенные биты памяти ?

Актуальный код слейва:
Спойлер
Код:
#include <mega8.h>
#include <math.h>
#include <io.h>
#include <delay.h>

#define  F_CPU (8000000)
#define  VFG_TIMER_MAX (65535)
#define  VFG_DDR DDRD
#define  VFG_PORT PORTD

unsigned char b1,b2,b3,b4;
volatile unsigned char i=0;
volatile unsigned long int fG;
volatile unsigned char nG;
unsigned int N[]={1,8,64,256,1024};
//BYTE STORAGE
volatile unsigned char master_arr [4];
//BYTE COUNTER
volatile int reqID;
volatile int flagRT=0;

void setup (void)
{
#asm("cli")
DDRB |= (1 << PORTB4);              //configure MISO as output
SPCR |= (1 << SPE) | (0 << MSTR);   //configure slave mod and interrupt
#asm("sei")
}

//***********************************************timer1************************************************

void main(void)
{
VFG_DDR = 0b00000111;
DDRC = 0b11111111;
setup();
#asm("sei")
for(;;) {
        while(PINB.2==1) // висим пока 1, как 0 идем дальше
        while(!(SPSR & (1<<SPIF)));// висим пока 0, как 1 идем дальше
        b1 = SPDR;
        while(!(SPSR & (1<<SPIF)));
        b2 = SPDR;
        while(!(SPSR & (1<<SPIF)));
        b3 = SPDR;
        while(!(SPSR & (1<<SPIF)));
        b4 = SPDR;
        //nG = master_arr[0] & 0x03; //generator number
        fG = 0 |b2 | (b3<<8)| (b4<<16);         
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)(fG&0xFF);
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)((fG>>8)&0xFF);
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)((fG>>16)&0xFF);
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)((fG>>24)&0xFF);
        }         
}

Актуальный код мастера:
Спойлер
Код:
#include <mega128.h>
#include <io.h>
#include <delay.h>

volatile unsigned char   reqTr,reqTm;

struct Tmr_t {
    unsigned char n;           
    double  F;
};

struct Tmr_t   T;       

unsigned char chrT;

typedef union //объединение
{
  unsigned long int w   ;     // w as WORD
  unsigned int h[2];     // h as HALF-WORD
  unsigned char  b[4];     // b as BYTE
} Union32;

Union32 dFi;

void SPI_MasterTransmit(unsigned char cData);

void IOInit(void) {

  PORTA = 0b00000000;
  DDRA  = 0b11111111;

  PORTB = 0b00001001;
  DDRB  = 0b11110111;

  PORTC = 0b00010000;
  DDRC  = 0b11111111;
 
  PORTD = 0b01101100;
  DDRD  = 0b10111011;
 
  PORTE = 0b00000011;
  DDRE  = 0b11111110;

  PORTF = 0b00000000;
  DDRF  = 0b11111110;

  PORTG = 0b00000000;
  DDRG  = 0b11111111;
 
  reqTr=0;
  reqTm=0;
}


void SPI_MasterInit(void) {
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);    /* Enable SPI, Master, set clock rate fck/16 */
}

void SPI_MasterTransmit(unsigned char cData) {
    SPDR = cData;                        /* Start transmission */
    while(!(SPSR & (1<<SPIF)));        /* Wait for transmission complete */
}

void SPITransmitFreq(unsigned char Cnt, double F) { //F- значение частоты
    //dFi.w = F*167.77216; //частота передаваемая через SPI, какое-то фиксированное число 167.77216
    PORTB &= ~(1<<PORTB0);
SPI_MasterTransmit(dFi.b[2]);
SPI_MasterTransmit(0xff); //пустышка
SPI_MasterTransmit(0xff); // младший байт
SPI_MasterTransmit(0xff); // 2
SPI_MasterTransmit(0xff); // 3
SPI_MasterTransmit(0xff); // старший
PORTB |= (1<<PORTB0);
PORTB |= (1<<PORTB0);
}

void main(void)
{
chrT=0x01;
T.n=0;
T.F=0;
SPI_MasterInit();
IOInit();
while (1)
      {
      unsigned char nG=2;
     double fG=100;
      SPITransmitFreq(T.n, T.F);//T.F-значение частоты, T.n-номер генератора

               switch(nG) {
                  case 0:   {T.n=0; T.F=fG; reqTm=1;}; break;   
                  case 1:   {T.n=1; T.F=fG; reqTm=1;}; break;
                  case 2:   {T.n=2; T.F=fG; reqTm=1;}; break;
                    }

      }
}
Вложения
Безымянный11.pdf
(567.8 KiB) Скачиваний: 25

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 18:44:27

отвечать могу только вечером

вы зачем голову отключаете, когда вставляете чужой код?
я же писал "допишите", а не замените; и dFi.w вы выкинуть не можете вы из него dFi.b[] берете, давайте хоть на 1 умножим. у вас мастер ничего путного не передает.
мастер должен отсылать 9 байт : 4- канал и "частота" и 5- пустышек чтобы протактировать передачу от слейва - возврат fG.
вставте это:
dFi.w = F*1 ;
PORTB &= ~(1<<PORTB0);
SPI_MasterTransmit(Cnt & 0x03);
SPI_MasterTransmit(dFi.b[0]);
SPI_MasterTransmit(dFi.b[1]);
SPI_MasterTransmit(dFi.b[2]);
SPI_MasterTransmit(0xff); //пустышка
SPI_MasterTransmit(0xff); // младший байт из fG
SPI_MasterTransmit(0xff); // 2-й из fG
SPI_MasterTransmit(0xff); // 3-й из fG
SPI_MasterTransmit(0xff); // старший из fG
PORTB |= (1<<PORTB0);

в слейве сделайте начало приема таким:
...
while(PINB.2==1); // <- здесь я пропустил ";"
unsigned char b1,b2,b3,b4; // <- переменные должны быть объявлены здесь
while(!(SPSR & (1<<SPIF)));
...
здесь и моя опечатка была - ";" пропустил - в смысле не поставил.
и Вы выкинули b1,b2,b3,b4 наверх - сделав их глобальными, а это абсолютно бессмысленно, они должны быть локальными - если регистров достаточно и компилятор неленивый прокрутит их в РОН, вообще не обращаясь в ОЗУ.

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 19:19:12

a797945, ситуация та же. Непонятно почему слейв даже просто байты пустышки неверно сохраняет.

мастер:
Спойлер
Код:
#include <mega128.h>
#include <io.h>
#include <delay.h>

volatile unsigned char   reqTr,reqTm;

struct Tmr_t {
    unsigned char n;           
    double  F;
};

struct Tmr_t   T;       

unsigned char chrT;

typedef union //объединение
{
  unsigned long int w   ;     // w as WORD
  unsigned int h[2];     // h as HALF-WORD
  unsigned char  b[4];     // b as BYTE
} Union32;

Union32 dFi;

void SPI_MasterTransmit(unsigned char cData);

void IOInit(void) {

  PORTA = 0b00000000;
  DDRA  = 0b11111111;

  PORTB = 0b00001001;
  DDRB  = 0b11110111;

  PORTC = 0b00010000;
  DDRC  = 0b11111111;
 
  PORTD = 0b01101100;
  DDRD  = 0b10111011;
 
  PORTE = 0b00000011;
  DDRE  = 0b11111110;

  PORTF = 0b00000000;
  DDRF  = 0b11111110;

  PORTG = 0b00000000;
  DDRG  = 0b11111111;
 
  reqTr=0;
  reqTm=0;
}


void SPI_MasterInit(void) {
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);    /* Enable SPI, Master, set clock rate fck/16 */
}

void SPI_MasterTransmit(unsigned char cData) {
    SPDR = cData;                        /* Start transmission */
    while(!(SPSR & (1<<SPIF)));        /* Wait for transmission complete */
}

void SPITransmitFreq(unsigned char Cnt, double F) { //F- значение частоты
dFi.w = F*1 ;
PORTB &= ~(1<<PORTB0);
SPI_MasterTransmit(Cnt & 0x03);
SPI_MasterTransmit(dFi.b[0]);
SPI_MasterTransmit(dFi.b[1]);
SPI_MasterTransmit(dFi.b[2]);
SPI_MasterTransmit(0xff); //пустышка
SPI_MasterTransmit(0xff); // младший байт из fG
SPI_MasterTransmit(0xff); // 2-й из fG
SPI_MasterTransmit(0xff); // 3-й из fG
SPI_MasterTransmit(0xff); // старший из fG
PORTB |= (1<<PORTB0);
}

void main(void)
{
chrT=0x01;
T.n=0;
T.F=0;
SPI_MasterInit();
IOInit();
while (1)
      {
      unsigned char nG=2;
     double fG=100;
      SPITransmitFreq(T.n, T.F);//T.F-значение частоты, T.n-номер генератора

               switch(nG) {
                  case 0:   {T.n=0; T.F=fG; reqTm=1;}; break;   
                  case 1:   {T.n=1; T.F=fG; reqTm=1;}; break;
                  case 2:   {T.n=2; T.F=fG; reqTm=1;}; break;
                    }

      }
}


слейв:
Спойлер
Код:
#include <mega8.h>
#include <math.h>
#include <io.h>
#include <delay.h>

#define  F_CPU (8000000)
#define  VFG_TIMER_MAX (65535)
#define  VFG_DDR DDRD
#define  VFG_PORT PORTD

volatile unsigned char i=0;
volatile unsigned long int fG;
volatile unsigned char nG;
unsigned int N[]={1,8,64,256,1024};
//BYTE STORAGE
volatile unsigned char master_arr [4];
//BYTE COUNTER
volatile int reqID;
volatile int flagRT=0;

void setup (void)
{
#asm("cli")
DDRB |= (1 << PORTB4);              //configure MISO as output
SPCR |= (1 << SPE) | (0 << MSTR);   //configure slave mod and interrupt
#asm("sei")
}

//***********************************************timer1************************************************

void main(void)
{
unsigned char b1,b2,b3,b4;
VFG_DDR = 0b00000111;
DDRC = 0b11111111;
setup();
#asm("sei")
for(;;) {
        while(PINB.2==1); // висим пока 1, как 0 идем дальше
        while(!(SPSR & (1<<SPIF)));// висим пока 0, как 1 идем дальше
        b1 = SPDR;
        while(!(SPSR & (1<<SPIF)));
        b2 = SPDR;
        while(!(SPSR & (1<<SPIF)));
        b3 = SPDR;
        while(!(SPSR & (1<<SPIF)));
        b4 = SPDR;
        //nG = master_arr[0] & 0x03; //generator number
        fG = 0 |b2 | (b3<<8)| (b4<<16);         
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)(fG&0xFF);
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)((fG>>8)&0xFF);
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)((fG>>16)&0xFF);
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)((fG>>24)&0xFF);
        }         
}
Вложения
Безымянный.pdf
(578.1 KiB) Скачиваний: 33

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 19:43:30

с мастером - порядок, а во со слейвом - возможно придется вернуться к прерыванию
но можно? не большой эксперимент:
while(PINB.2==1);
while(!(SPSR & (1<<SPIF)));
b1 = SPDR;
SPDR = 1;
while(!(SPSR & (1<<SPIF)));
b2 = SPDR;
SPDR = 2;
while(!(SPSR & (1<<SPIF)));
b3 = SPDR;
SPDR = 3;
while(!(SPSR & (1<<SPIF)));
b4 = SPDR;
SPDR = 4;

fG = 0 |b2 | (b3<<8)| (b4<<16);
while(!(SPSR & (1<<SPIF)));
SPDR = 0x11;
while(!(SPSR & (1<<SPIF)));
SPDR = 0x12;
while(!(SPSR & (1<<SPIF)));
SPDR = 0x13;
while(!(SPSR & (1<<SPIF)));
SPDR = 0x14;

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 19:47:51

a797945, вот такой вот результат получился, немного отличается от прошлых результатов, хотябы тем, что протеус больше не ругается.
Вложения
Безымянный.pdf
(503.44 KiB) Скачиваний: 28

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 19:54:10

не прерывание не нужно, и по флагу работает.
замените SPDR = 0x11; этим SPDR =( fG&0xFF);

и unsigned char b1,b2,b3,b4;
должно быт внутри for цикла.
где я писал?

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 19:57:02

a797945, не компилится, если внутрь цикла for их засовывать.

Добавлено after 1 minute 5 seconds:
а, нет компилируется

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 19:59:53

теперь я тороплюсь передача ползет.

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 20:00:29

a797945, все равно, неправильно читает данные.
Вложения
Безымянный.pdf
(482.18 KiB) Скачиваний: 34

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 20:12:03

можно предположить - PINB.2 не подключен к порту, он идет в spi.

пока предложение: на него постоянно подать 0, а в слейве за место его использовать свободную ногу, т.е. типа
while(PINB.1==1);
если она не занята

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 20:13:48

a797945, как попробую отпишусь.

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Пн июл 10, 2023 20:58:11

жаль нет флага активности передачи, по этому:
или физически соединить PINB.2 (SS) и PINB.1 (для примера) - начало передачи контролировать по PINB.1.
или применять программную синхр., типа 4-х 0x55 подряд, с пятого начало полезной инф.

специалисты помалкивают, посмеиваются, наверно ;)

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Вт июл 11, 2023 08:28:39

a797945, перепробовал много вариаций, предложенного вами варианта, но итог все равно тот же. Еще и протеус начал ругаться PC=0x0190 SPDR Write collision. Written data(0x00) is ignored, как он может ругаться, что 0 записывается в SPDR, если в коде я нигде не записываю 0.

Код слейва:
Спойлер
Код:
#include <mega8.h>
#include <math.h>
#include <io.h>
#include <delay.h>

#define  F_CPU (8000000)
#define  VFG_TIMER_MAX (65535)
#define  VFG_DDR DDRD
#define  VFG_PORT PORTD

volatile unsigned char b1,b2,b3,b4;
volatile unsigned char i=0;
volatile unsigned long int fG;
volatile unsigned char nG;
unsigned int N[]={1,8,64,256,1024};
//BYTE STORAGE
volatile unsigned char master_arr [4];
//BYTE COUNTER
volatile int reqID;
volatile int flagRT=0;

void setup (void)
{
#asm("cli")
DDRB |= (1 << PORTB4);              //configure MISO as output
SPCR |= (1 << SPE) | (0 << MSTR);   //configure slave mod and interrupt
#asm("sei")
}

//***********************************************timer1************************************************

void main(void)
{
VFG_DDR = 0b00000111;
DDRC = 0b11111111;
setup();
#asm("sei")
for(;;) {
        while(PINB.2==1 && PINB.1==1) // висим пока 1, как 0 идем дальше
        while(!(SPSR & (1<<SPIF)));// висим пока 0, как 1 идем дальше
        if (SPDR == 0xff) {flagRT++;};
        if (flagRT == 1) {b1 = SPDR; flagRT++;};
        while(!(SPSR & (1<<SPIF)));
        if (flagRT == 2) {b2 = SPDR; flagRT++;};
        while(!(SPSR & (1<<SPIF)));
        if (flagRT == 3) {b3 = SPDR; flagRT++;};
        while(!(SPSR & (1<<SPIF)));
        if (flagRT == 4) {b4 = SPDR; flagRT++;};
        while(!(SPSR & (1<<SPIF)));// висим пока 0, как 1 идем дальше
        if (SPDR == 0xff) {flagRT = 0;};
        //nG = master_arr[0] & 0x03; //generator number
        fG = 0 |b2 | (b3<<8)| (b4<<16);         
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)(fG&0xFF);
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)((fG>>8)&0xFF);
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)((fG>>16)&0xFF);
        while(!(SPSR & (1<<SPIF)));
        SPDR = (char)((fG>>24)&0xFF);
        }         
}


Код мастера:
Спойлер
Код:
#include <mega128.h>
#include <io.h>
#include <delay.h>

volatile unsigned char   reqTr,reqTm;

struct Tmr_t {
    unsigned char n;           
    double  F;
};

struct Tmr_t   T;       

unsigned char chrT;

typedef union //объединение
{
  unsigned long int w   ;     // w as WORD
  unsigned int h[2];     // h as HALF-WORD
  unsigned char  b[4];     // b as BYTE
} Union32;

Union32 dFi;

void SPI_MasterTransmit(unsigned char cData);

void IOInit(void) {

  PORTA = 0b00000000;
  DDRA  = 0b11111111;

  PORTB = 0b00001001;
  DDRB  = 0b11110111;

  PORTC = 0b00010000;
  DDRC  = 0b11111111;
 
  PORTD = 0b01101100;
  DDRD  = 0b10111011;
 
  PORTE = 0b00000011;
  DDRE  = 0b11111110;

  PORTF = 0b00000000;
  DDRF  = 0b11111110;

  PORTG = 0b00000000;
  DDRG  = 0b11111111;
 
  reqTr=0;
  reqTm=0;
}


void SPI_MasterInit(void) {
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);    /* Enable SPI, Master, set clock rate fck/16 */
}

void SPI_MasterTransmit(unsigned char cData) {
    SPDR = cData;                        /* Start transmission */
    while(!(SPSR & (1<<SPIF)));        /* Wait for transmission complete */
}

void SPITransmitFreq(unsigned char Cnt, double F) { //F- значение частоты
//dFi.w = F*167.77216; //частота передаваемая через SPI, какое-то фиксированное число 167.77216
PORTB &= ~(1<<PORTB0);
SPI_MasterTransmit(0xff); //пустышка
SPI_MasterTransmit(1); //пустышка
SPI_MasterTransmit(2); // младший байт
SPI_MasterTransmit(3); // 2
SPI_MasterTransmit(4); // 3
SPI_MasterTransmit(0xff); //пустышка
PORTB |= (1<<PORTB0);
}

void main(void)
{
chrT=0x01;
T.n=0;
T.F=0;
SPI_MasterInit();
IOInit();
while (1)
      {
      unsigned char nG=2;
     double fG=100;
      SPITransmitFreq(T.n, T.F);//T.F-значение частоты, T.n-номер генератора

               switch(nG) {
                  case 0:   {T.n=0; T.F=fG; reqTm=1;}; break;   
                  case 1:   {T.n=1; T.F=fG; reqTm=1;}; break;
                  case 2:   {T.n=2; T.F=fG; reqTm=1;}; break;
                    }

      }
}
Вложения
Безымянный10.pdf
(542.33 KiB) Скачиваний: 33

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313

Вт июл 11, 2023 09:28:48

Write collision - одна операция не завершена, начинается другая (но есть вероятность, что это только в симуляции, поэтому нужен и тест реального устройства).

Остальные порты свободные на обоих МК? Идея: попробуйте с другим способом отладки: LCD, LCD/I2c, UART и т.д. Аппаратный UART, программный UART ... много вариантов есть.
Ответить