Я тестирую SPI своего микроконтроллера PIC24E512GU814. Для проверки я подключил MOSI к MISO.
Я написал следующий код для инициализации SPI:
SPI3CON1 = 0;
SPI3CON1bits.CKE = 1;
SPI3CON1bits.SPRE = 7;
SPI3CON1bits.PPRE = 3;
SPI3CON1bits.MSTEN = 1;
SPI3STATbits.SPIEN = 1;
Затем для передачи/получения следующего кода:
SPI3_ENABLE = 0; //chip select
delayUs(1);
while (SPI3STATbits.SPITBF);
SPI3BUF = test;
while (!SPI3STATbits.SPIRBF)
{
if (--timeout == 0)
{
debugOutput(0, "\r\nTimeout SPI 3\r\n");
}
}
temp = SPI3BUF;
debugOutput(0, "\r\nValue read on SPI 3 Port:%d\r\n", temp);
SPI3_ENABLE = 1;
Я всегда получаю половину переданного значения. Например, если я передаю 54, я читаю 27 в приемном буфере. В чем может быть проблема?
Изменил код на следующий не помогло
delayUs(1);
//writeSPI(eSpiPort3, &test, sizeof(byte));
debugOutput(0, "\r\nWriting on SPI 3 Port:%d\r\n", test);
SPI3_ENABLE = 0;
while (SPI3STATbits.SPITBF);
SPI3BUF = test;
while (!SPI3STATbits.SPIRBF)
{
if (--timeout == 0)
{
debugOutput(0, "\r\nTimeout SPI 3\r\n");
}
}
temp = SPI3BUF;
SPI3_ENABLE = 1;
delayUs(1);
debugOutput(0, "\r\nValue read on SPI 3 Port:%d\r\n", temp);
Вы установили биты PPRE и биты SPRE в регистре SSPI3CON1 на 1:1, это со страницы 9 справочного руководства .
Не устанавливайте первичный и вторичный предварительные делители на значение 1:1 одновременно.
Абель Том
доктор Джамал
Питер Смит
доктор Джамал
Абель Том
доктор Джамал