我正试图让SPI在PIC32MX250F128D上工作而没有太多运气。
我尝试了8位模式和32位模式,但我没有获得所有数据或根本没有数据。
我正在尝试使用4MHz SPI驱动WS2812 ledstrip。
这是我的代码:
#include <xc.h>
#include <peripheral/system.h>
#include "config.h"
void settings( void );
char Send_SPI(unsigned char);
int main( void ) {
int i, j;
unsigned char scrapdata;
unsigned char buffer[6] = {0x12, 0x34, 0x56, 0x78, 0x90, 0x01};
settings();
while(1) {
Send_SPI(buffer[j]);
j = (j > 4)? 0 : j++;
for(i = 0; i < 300; i++);
}
return 0;
}
void settings( void ) {
SYSTEMConfigPerformance(SYS_FREQ);
TRISB &= 0xFFFB;
RPB2R = 0x3;
SPI1STAT = 0;
SPI1CON = 0;
unsigned int rData = SPI1BUF;
// => 4MHz = 48MHz / (2 * (5 + 1))
SPI1BRG = 5;
SPI1STATCLR = 0x40; // clear the Overflow
SPI1CON = 0x00008230;
}
char Send_SPI(unsigned char buffer) {
//while(!(SPI1STAT & 0x2));
SPI1BUF = buffer;
while(!(SPI1STAT & 0x1)); // wait transfer complete
char scrapdata = SPI1BUF; //read to clear SPI2BUF before reload
return scrapdata;
}
目前控制器没有任何东西出来。 你们中有谁知道什么是错的吗?
Laurens的
答案 0 :(得分:0)
在j
中使用它之前,您从未初始化main()
,这意味着您最初可能会发出乱码。此外,您的三元操作j = (j > 4)? 0 : j++;
的结果尚未明确定义,因为您在某个时候基本上都在说j = j++
。使用以下内容简化:
if (j > 4) j = 0;
else j++;
最后,使用移位寄存器和一堆LED测试SPI初始化代码,以确保它一切顺利。逻辑分析仪还可以帮助查看MCU发出的信号(如果有的话)。
答案 1 :(得分:0)
尝试示波器并检查是否获得CS和SCK信号,如果不是SPI未初始化!但是对于PIC系列,有许多无痛的方法可以编写SPI:
使用bit banging,如下所示:
char SPI_BB(char byte8) {
char counter;
for (counter = 8; counter; counter--) {
if (byte8 & 0x80)
MOSI=1;
else
MOSI=0;
byte8 <<= 1;
SCK=1; /* a slave latches input data bit */
if ((MIS0))
byte8 |= 0x01;
SCK=0; /* a slave shifts out next output data bit */
}
return byte8;
}
以上代码处于SPI模式0。