Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Приколы SPI у C8051F410
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Alex007
Приветствую
Не удается подружить аппаратный SPI C8051F410 с CP2120.
Попробовал программно сделать (закомментировано в тексте) все работает отлично.
Пробовал менять фазы и др. настройки для SPI - ничего не дает. SPI работает (на осциллографе посмотрел выход SCK и MOSI), времянки правильные. Но увидеть фазу посылки на осцилле не получается, он без памяти.
Предполагаю,что не верные фазы или направление передачи (нужно MSB first).


#include "C8051F410.h"
sbit SCK = P1^1; // SPI clock pin
sbit MISO = P1^3; // SPI data input
sbit MOSI = P1^4; // SPI data output
sbit CPCS = P1^5; // CP2120 chip select active low

char r=0, p=0;

void SPI_Init()
{
SPI0CFG = 0x70;
SPI0CKR = 0x79;
SPI0CN = 0x0D;

SPIEN = 1;
}

void Port_IO_Init()
{
// P1.1 - SCK (SPI0), Push-Pull, Digital
// P1.3 - MISO (SPI0), Push-Pull, Digital
// P1.4 - MOSI (SPI0), Push-Pull, Digital
// P1.5 - NSS (SPI0), Push-Pull, Digital

P0MDIN = 0xFE;
P1MDIN = 0xFB;
P2MDIN = 0x03;
P1MDOUT = 0x7B;
P2MDOUT = 0x03;
P0SKIP = 0xCF;
P1SKIP = 0xC5;
P2SKIP = 0xFF;
XBR0 = 0x03;
XBR1 = 0x40;
P0MASK = 0x4E;

// инициализация для программного SPI
/*
P0MDIN = 0xFE; //hard SPI
P1MDIN = 0xFB;
P2MDIN = 0x03;
P1MDOUT = 0x7B;
P2MDOUT = 0x03;
P0SKIP = 0xCF;
P1SKIP = 0x05;
XBR0 = 0x01;
XBR1 = 0x40;
P0MASK = 0x4E;
*/
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
}

void Oscillator_Init()
{
OSCICN = 0x87; // при программном сбрасывал до 0x83
}

void Init_Device(void)
{
// disable watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer enable)
Port_IO_Init();
Oscillator_Init();
SPI_Init();

}

void small_delay(char ms) //xtal 50MHz ms=1->185nsec
{
while (ms--);
}

// Программный SPI, рабочий
/*void Send_SPI(char byte3) // MSB first
{
char tmp;
for (tmp = 0; tmp < 8; tmp ++)
{
if (byte3 & 0x80) MOSI = 1;
else MOSI = 0;
SCK=0;
SCK=1;
byte3 <<= 1;
}
}
*/

void main (void)
{
Init_Device();

//Рабочий кусок с вызовом программного SPI обращение к CP2120
/* CPCS = 0;
Send_SPI(0x18); // выбор направления приема/передачи данных MSB first
Send_SPI(0x81);

Send_SPI(0x20); // настройка портов
Send_SPI(0x00);
Send_SPI(0xAA);

Send_SPI(0x20); // настройка портов
Send_SPI(0x07);
Send_SPI(0xAA);

Send_SPI(0x20); // инициалзация портов
Send_SPI(0x01);
Send_SPI(0x48);
CPCS = 1;
*/

NSSMD0 = 0;
small_delay(20);


SPI0DAT = 0x18;
while (TXBMT != 1){}
SPI0DAT = 0x81;
while (TXBMT != 1){}


SPI0DAT = 0x20;
while (TXBMT != 1){ }
SPI0DAT = 0x00;
while (TXBMT != 1){}
SPI0DAT = 0xAA;
while (TXBMT != 1){}


SPI0DAT = 0x20;
while (TXBMT != 1){ }
SPI0DAT = 0x07;
while (TXBMT != 1){ }
SPI0DAT = 0xAA;
while (TXBMT != 1){ }


SPI0DAT = 0x20;
while (TXBMT != 1){ }
SPI0DAT = 0x01;
while (TXBMT != 1){}
SPI0DAT = 0x48;
while (TXBMT != 1){}

SPIF = 0;
while (SPIF != 1){}
SPIF = 0;

small_delay(20);
NSSMD0 = 1;

while(1){}
}
Kolia
Я тоже как-то столкнулся с глюками (правда f310) cygnal'a. В итоге выяснилось, что это мои глюки 07.gif.
Вот как я реализовал SPI-master для связи двух f310 микрокнтр. Возможно пригодится.

Код
void Init_SPI0(byte speed)
{    
    XBR0    |= 0x02;//routed SPI to crossbar
    
    SPI0CKR=speed; //max speed=0; min = 0xFF
    
    SPI0CFG=_0b01010000;

    SPI0CN= _0b00001001;

}

void delay(char d)
{
        while((d--)>0) _nop_();
}


byte SPI_Transfer(byte SPI_byte)//MODE_3
{
    SPIF=0;
    SPI0DAT=SPI_byte;
    while(SPIF==0);
    return SPI0DAT;
}

void set_spi(byte *buf, byte n)
{
byte i;            
        
    SPI0CN&=~0x04;
    delay(2);
    for(i=0;i<n;i++){
        SPI_Transfer(buf[i]);
    }
    SPI0CN|=0x04;    
}

void main() {

unsigned char buf [20]="1234567890        ";

// init Potrs
//SCK (SPI0), Push-Pull output , Digital
//MISO (SPI0), open-drain input, Digital
//MOSI (SPI0), Push-Pull output , Digital
//NSS (SPI0), Push-Pull output , Digital

Init_SPI0(20);// 20 - max speed for slave devise on f310

set_spi(buf, 20);

while(1);

}
Alex007
Спасибо, Коля.
На этот раз глюк оказался не во мне. SPI в 410-м работал правильно. А вот в доке на 2120 нашлась досаднейшая ошибка.
koyodza
Цитата(Alex007 @ May 14 2007, 21:37) *
Спасибо, Коля.
На этот раз глюк оказался не во мне. SPI в 410-м работал правильно. А вот в доке на 2120 нашлась досаднейшая ошибка.

А нельзя ли ее озвучить? вдруг пригодится кому-то
Alex007
Сорри за отсутствие.
В доке на 2120 не правильно указана фаза работы spi. И диаграмму неправильную всунули. Надо фазу наоборот, тогда все ок.
Отписал на silabs, но что-то не шевелятся с ответом - переапроверяют видимо.
П.С. У меня 2120 ревизии 1.00
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.