Код:
#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_tim.h>
#include <misc.h>
#define enc28j60_select() asm("nop")
#define enc28j60_release() asm("nop")
//Èíèöèàëèçàöèÿ GPIO
void gpio_init()
{
// Initialize SPI
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
// MOSI & CLK
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// MISO
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// SS
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// RESET
GPIO_InitTypeDef GPIO_InitStruct2;
GPIO_InitStruct2.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct2.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct2.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct2);
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE);
}
// Îïåðàöèÿ ÷òåíèÿ
uint8_t enc28j60_read_op(uint8_t cmd, uint8_t adr)
{
uint8_t data;
// Íèçêèé óðîâåíü íà CS
enc28j60_select();
// Îòïðàâëÿåì êîìàíäó
SPI1->DR = (uint8_t)cmd | (adr & 0x1f);
while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)
// Ïðè íåîáõîäèìîñòè, ïðîïóñêàåì "ëîæíûé" áàéò
if(adr & 0x80)
{
SPI1->DR = (uint8_t)0x1f;
while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)
}
// ×èòàåì äàííûå
data = SPI1->DR;
// Âûñîêèé óðîâåíü íà íîæêå CS
enc28j60_release();
return data;
}
// Îïåðàöèÿ çàïèñè
void enc28j60_write_op(uint8_t cmd, uint8_t adr, uint8_t data)
{
enc28j60_select();
// Îòïðàâëÿåì êîìàíäó
SPI1->DR = cmd | (adr & 0x1f);
while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)
// Îòïðàâëÿåì çíà÷åíèå
SPI1->DR = data;
while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)
enc28j60_release();
}
int main(void)
{
for (int i=0; i<1; i++) Delay3();
gpio_init();
SPI_Cmd(SPI1, ENABLE);
GPIO_SetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
/*
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
Delay3();
GPIO_SetBits(GPIOB, GPIO_Pin_1);
Delay3();
Delay3();
Delay3();
Delay3();
Delay3();
Delay3();
*/
uint8_t data;
// SPI1->DR = 0xFF;
// Delay3();
for (int i=0; i<14; i++)
{
enc28j60_write_op(ENC28J60_SPI_BFC, 0x1f, 0x03);
enc28j60_write_op(ENC28J60_SPI_BFS, 0x1f, 0x03);
enc28j60_write_op(ENC28J60_SPI_BFC, 0x15, 0x07);
enc28j60_write_op(ENC28J60_SPI_BFS, 0x15, 0x01);
// enc28j60_write_op(ENC28J60_SPI_BFC, 0x15, 0x05);
// enc28j60_write_op(ENC28J60_SPI_BFS, 0x15, 0x01);
// enc28j60_write_op(ENC28J60_SPI_BFC, 0x15, 0x05);
/* data = enc28j60_read_op(ENC28J60_SPI_RCR, 0x00);
data++;
data = enc28j60_read_op(ENC28J60_SPI_RCR, 0x01);
data++;
data = enc28j60_read_op(ENC28J60_SPI_RCR, 0x15);
data++;
data = enc28j60_read_op(ENC28J60_SPI_RCR, 0x12);
data++;
*/
// enc28j60_select();
// SPI1->DR = 0xFF;
// while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)
// enc28j60_release();
}
while (1)
{
data = enc28j60_read_op(ENC28J60_SPI_RCR, 0x12);
data++;
Delay1();
}
}
Краткие пояснения: пытаюсь изменить частоту выхода ClockOut микросхемы enc28j60. Но тут есть пару помойму ошибок, я думаю что это
1. Померял выходной сигнал с этого вывода, выходит синусоида, но не ровная, а как бы поплыла
2. Возможно нужно соеденять меньшими проводами и витой парой а не прямыми?
3. С микросхемы енки выходит какойто мусор с выхода СПИ, как будто биты иногда проскакивают.
4. Танцы с бубнами и множество перезагрузок иногда меняло частоту енки и иногда как я понял отключало клок, только почемуто на +, возможно включало частоту 25мгц и осилографом не видно было.
5.соеденял между собой выходы на стм микросхеме, данные отправляются и принимаются нормально, а на енку почемуто не идут.
В чем может быть причина? уровни питания везде нормальные.