Страница 6 из 7
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пт июл 07, 2023 16:15:53
veso74
Код: Выделить всё
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.
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пт июл 07, 2023 16:21:45
warptred12
a797945, ну тогда так получается: fG = (master_arr[1])|(master_arr[2] <<

|(master_arr[3] << 16);
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пт июл 07, 2023 16:32:42
a797945
veso74, Какова цель? - отладка, человек хочет увидеть, что слейв все принял верно, на мастере он и не ловит ответ.
warptred12
да. наконец то. сами посмотрите где младший байт частоты до передачи, и куда вы его помещаете при приеме и склейке.
коли транспорт заработал, включите SPI на полную скорость, проверьте - не спотыкается ли.
да и надо переходить на целевой МК, т.е. на чем будете собирать - что бы работал и там.
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пт июл 07, 2023 16:53:15
warptred12
a797945, я не понимаю как и где мне его посмотреть, когда я принимаю полученные байты на слейве - я присваиваю их значение элементам массива master_array и отправляю присвоенные значения обратно, а потом уже склеиваю их в переменной fG, эти элементы массива я никак не меняю, но при передаче этих элементов массива, отправленные данные я никак не изменяю, тогда почему они приходят на мастера со сдвигом?
Добавлено after 4 minutes 54 seconds:
veso74, я отправляю значения элементов массива обратно, чтобы увидеть на SPI анализаторе что я сохранил в эти элементы массивов.
Да увидел ошибку с for, там действительно должно быть 4, спасибо. Но ничего не изменилось, все так же сдвигает данные почему-то.
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пт июл 07, 2023 17:38:45
a797945
"почему они приходят на мастера со сдвигом?"
нет там сдвига.
не понимаете, потому, что торопитесь. медленно продумайте что я сказал про 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 = 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
a797945
сразу не посмотрел код, теперь забираю свои слова, что транспорт работает - код не рабочий.
если и сделал вид, вероятно это закидоны протеуса, в "железе" корректно работать не будет.
чой-то народ не среагировал на это безобразие:
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char i=0;
for(i=0;i<5;i++) {
master_arr = SPDR;
SPDR = master_arr ;
}
}
и отсутствие очистки флага 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
warptred12
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;
}
}
}
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пн июл 10, 2023 18:44:27
a797945
отвечать могу только вечером
вы зачем голову отключаете, когда вставляете чужой код?
я же писал "допишите", а не замените; и 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
warptred12
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);
}
}
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пн июл 10, 2023 19:43:30
a797945
с мастером - порядок, а во со слейвом - возможно придется вернуться к прерыванию
но можно? не большой эксперимент:
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
warptred12
a797945, вот такой вот результат получился, немного отличается от прошлых результатов, хотябы тем, что протеус больше не ругается.
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пн июл 10, 2023 19:54:10
a797945
не прерывание не нужно, и по флагу работает.
замените SPDR = 0x11; этим SPDR =( fG&0xFF);
и unsigned char b1,b2,b3,b4;
должно быт внутри for цикла.
где я писал?
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пн июл 10, 2023 19:57:02
warptred12
a797945, не компилится, если внутрь цикла for их засовывать.
Добавлено after 1 minute 5 seconds:
а, нет компилируется
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пн июл 10, 2023 19:59:53
a797945
теперь я тороплюсь передача ползет.
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пн июл 10, 2023 20:00:29
warptred12
a797945, все равно, неправильно читает данные.
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пн июл 10, 2023 20:12:03
a797945
можно предположить - PINB.2 не подключен к порту, он идет в spi.
пока предложение: на него постоянно подать 0, а в слейве за место его использовать свободную ногу, т.е. типа
while(PINB.1==1);
если она не занята
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пн июл 10, 2023 20:13:48
warptred12
a797945, как попробую отпишусь.
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Пн июл 10, 2023 20:58:11
a797945
жаль нет флага активности передачи, по этому:
или физически соединить PINB.2 (SS) и PINB.1 (для примера) - начало передачи контролировать по PINB.1.
или применять программную синхр., типа 4-х 0x55 подряд, с пятого начало полезной инф.
специалисты помалкивают, посмеиваются, наверно

Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Вт июл 11, 2023 08:28:39
warptred12
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;
}
}
}
Re: Проблема при связи SPI и USI AT90CAN128 и Attiny2313
Добавлено: Вт июл 11, 2023 09:28:48
veso74
Write collision - одна операция не завершена, начинается другая (но есть вероятность, что это только в симуляции, поэтому нужен и тест реального устройства).
Остальные порты свободные на обоих МК? Идея: попробуйте с другим способом отладки: LCD, LCD/I2c, UART и т.д. Аппаратный UART, программный UART ... много вариантов есть.