使用的主芯片是是pic8f67j94;
使用的存储芯片是W25Q16;
步骤一
spi初始化
void Spi_Init(void)
{
RPINR12_13bits.SDI2R = 0x01; //SDI2 A5
RPOR4_5bits.RPO4R = 0x04; //SDO2 A4
RPOR6_7bits.RPO6R = 0x05; //CLK2
TRISCbits.TRISC6 = 0; //wp
LATCbits.LATC6 = 1;
TRISCbits.TRISC7 = 0; //CS
LATCbits.LATC7 = 1;
TRISAbits.TRISA6 = 0; //CLK A6
LATAbits.LATA6 = 0;
TRISAbits.TRISA4 = 0; //DIO SDO
LATAbits.LATA4 = 0;
LATAbits.LATA5 = 0; //important1
ANCON1bits.ANSEL5 = 0; //important1
TRISAbits.TRISA5 = 1; //DO SDI
SSP2STATbits.SMP = 0;
SSP2STATbits.CKE = 1; //to idle
SSP2CON1bits.WCOL = 0;
SSP2CON1bits.CKP = 0;
SSP2CON1bits.SSPM = 1;
SSP2CON1bits.SSPEN = 1;
}
- 在配置spi接口复用的时候要注意用的是spi1还是spi2,这里使用RPINRxx和RPORxx两个寄存器进行配置复用;
- 使用时注意主芯片的SDO硬件上接存储芯片的DIO,SDI硬件上接存储芯片的DO;
- 在spi初始化配置时一定要把SDI口的ANCON1(模拟或数字)寄存器配置为数字(不知道原因,但是去掉就无法获取正确值,代码中标注important1的地方),LATA配置为0,再配置TRISx为输入;
Spi_Send_Byte & Spi_Receive_Byte
void Spi_Send_Byte(unsigned char pdata)
{
unsigned int i = 0;
unsigned int time_out_counter = 0;
i = SSP2BUF; //important2
SSP2BUF = pdata;
i = 0;
while(!SSP2IF);
SSP2IF = 0;
while(!SSP2STATbi