реклама на сайте
подробности

 
 
> Приколы SPI у C8051F410
Alex007
сообщение May 14 2007, 06:22
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 19-06-05
Пользователь №: 6 132



Приветствую
Не удается подружить аппаратный 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){}
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 23:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.03153 секунд с 7
ELECTRONIX ©2004-2016