Embedded PIC-SPI从机选择不工作
我使用的是PIC24FJ128GB202,我想与无需响应的从属设备通信。因此,配置如下所示 我已经编写了如下代码Embedded PIC-SPI从机选择不工作,embedded,pic,spi,pic24,Embedded,Pic,Spi,Pic24,我使用的是PIC24FJ128GB202,我想与无需响应的从属设备通信。因此,配置如下所示 我已经编写了如下代码 /* * File: main.c * Author: Nikhil * * Created on September 18, 2015, 2:59 PM */ #include <stdio.h> #include <stdlib.h> #define FCY 16000000UL #include <xc.h> #in
/*
* File: main.c
* Author: Nikhil
*
* Created on September 18, 2015, 2:59 PM
*/
#include <stdio.h>
#include <stdlib.h>
#define FCY 16000000UL
#include <xc.h>
#include <libpic30.h>
#include<GenericTypeDefs.h>
#include <p24FJ128GB202.h>
_CONFIG4(DSWDTPS_DSWDTPS5 & DSWDTOSC_LPRC & DSBOREN_OFF & DSWDTEN_OFF & DSSWEN_OFF & PLLDIV_PLL8X & I2C1SEL_DISABLE & IOL1WAY_OFF)
_CONFIG3(WPFP_WPFP63 & SOSCSEL_OFF & WDTWIN_PS75_0 & BOREN_OFF & PLLSS_PLL_FRC & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPSTARTMEM) //& PLLSS_PLL_FRC
_CONFIG2(POSCMD_NONE & WDTCLK_LPRC & OSCIOFCN_ON & FCKSM_CSDCMD & FNOSC_FRCPLL & ALTRB6_RETAIN & ALTCMPI_CxINC_RX & WDTCMX_WDTCLK & IESO_OFF)//& FNOSC_FRCPLL
_CONFIG1(WDTPS_PS1024 & FWPSA_PR128 & WINDIS_OFF & FWDTEN_OFF & ICS_PGx1 & LPCFG_ON & GCP_OFF & JTAGEN_OFF)
void __attribute__((__interrupt__,__auto_psv__)) _SPI1Interrupt(void);
void SPI_write()
{
PORTAbits.RA2 =0;
SPI1BUFL = 0xAAAA;
}
void SPI_delay()
{
short i;
for(i=0;i<8;i++)
;
}
void SPI_config(){
SPI1CON1Lbits.SPIEN = 0 ;
__builtin_write_OSCCONL(OSCCON & 0xbf); // Unlock PPS
RPOR1bits.RP2R = 7; //SPI SDO1
RPOR1bits.RP3R = 8; //SPI SCK1
SPI1STATLbits.SPIROV =0; //OVERflow Flag reset
SPI1CON1Lbits.MSTEN = 1; //SPI Master
SPI1CON1Lbits.MODE = 1; //16- bit Data transfer
SPI1CON1Lbits.CKE = 0;
SPI1CON1Lbits.CKP =0;
__builtin_write_OSCCONL(OSCCON | 0x40); // Lock PPS
SPI1CON1Lbits.SPIEN = 1 ;
}
static inline void
init_io(void)
{
/* Digital Mode */
ANSA = 0;
ANSB = 0;
/* Reset O/P */
LATB = 0;
LATA =0 ;
/* O/D Off */
ODCA = 0;
ODCB = 0;
/* Define Outpot port */
TRISB = 0 ;
TRISA =0 ;
}
int main (void)
{
CLKDIVbits.CPDIV = 0x01;
init_io();
SPI_config();
//////////////////////////////// SPI Interrupt ////////////////////////////////
_SPI1IP = 1;
_SPI1IF = 0;
SPI1IMSKLbits.SRMTEN = 0x01;
_SPI1IE =1;
//////////////////////////////// main code //////////////////////////////////////////
while(1)
{
SPI_write();
__delay_ms(1);
}
return 0;
}
void __attribute__((__interrupt__, __auto_psv__)) _SPI1Interrupt(void)
{
// Clear SPI1 1 interrupt flag
_SPI1IF = 0;
PORTAbits.RA2 =1;
}
并在写入之前和之后尝试启用禁用pin像 还是同样的错误
求你了,求你了!!!帮助我对这个错误感到沮丧我想我可能也有同样的问题,但我想让从属选择在传输进行时断言,然后在传输之间取消断言。然而,像你一样,我无法让它去断言。我终于找到了一种方法,可以在传输之间取消断言。我轮询SS pin以查看它何时开始取消断言。这意味着内部ssp状态机已移动到“完成”状态,看不到通过管道进行多次传输的方法,现在将取消断言SS pin 因为我总是在做信号功转移,而且我永远不会做大的转移,所以我将把这个while语句移动到SPI1_Exchange16()调用中。SPI1_Excahnge16调用是SPI1_Exchange()调用的修改版本,该调用执行16位传输,而不是8位传输 下面是我的示例代码,我附加了一个跟踪,显示了SPI总线上while语句的影响。您可以看到前两个传输在传输之间有SS反断言
使用例如
PORTAbits
更改写入端口的每个实例,并使用相应的锁存寄存器。例如,代替PORTAbits.RA2=1
writeLATAbits.LATA2=1
。然后查看行为是否发生变化,并在必要时修改您的问题。您好,罗杰,我也尝试过。PORTAbits.RA2/LATCHAbits.LATA2的执行发生在数据传输之前。我尝试添加delay和while()语句,但结果相同。请注意,我已将pic的sdi引脚接地。更奇怪的是,如果我在(!SPI1STATLbits.SPIRBF)时写入,程序将在此语句处停止,数据只传输一次。正常过程是等待传输缓冲区可用,然后写入下一个符号。在所有写操作之后,您必须等待SPI不再忙。这两种情况都应该有状态标志,如果SPI不是双缓冲的,则只有忙/发送器空标志可用/需要。延迟-CPU周期更糟糕是一个非常糟糕的主意。我尝试使用while(!SPI1STATELbits.SRMT),即移位寄存器为空,而while(SPI1STATELbits.SPIBUSY)我得到了同样的结果,我现在非常沮丧:(
void SPI_write()
{
PORTAbits.RA2 =0;
short temp,temp1;
SPI1BUFL = 0xAAAA;
__delay_ms(1);
temp = SPI1BUFL;
temp1 =SPI1BUFH;
while(!SPI1STATLbits.SPIRBF);
}
PORTAbits.RA2 =0;
SPI_write();
PORTAbits.RA2 =1;
SPI1_Exchange16( &txData16[0], &rxData16[0] );
while (SS1_GetValue()==0){};
SPI1_Exchange16( &txData16[1], &rxData16[1] );
while (SS1_GetValue()==0){};
SPI1_Exchange16( &txData16[1], &rxData16[1] );
// NO WHILE STATEMENT
SPI1_Exchange16( &txData16[1], &rxData16[1] );
// NO WHILE STATEMENT
SPI1_Exchange16( &txData16[1], &rxData16[1] );
// NO WHILE STATEMENT