SPI和SSC配置文档
- 格式:docx
- 大小:286.14 KB
- 文档页数:5
1、SPI调试笔记SPI的初始化配置部分void InitSpi(void){//AT91F_SPI_CfgPIO ();//配置SPI的IOAT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, // PIO controller base address((unsigned int) AT91C_PA11_NPCS0)|((unsigned int) AT91C_PA13_MOSI)|((unsigned int) AT91C_PA12_MISO)|((unsigned int) AT91C_PA14_SPCK) , // Peripheral A((unsigned int) AT91C_PA9_NPCS1)|((unsigned int) AT91C_PA10_NPCS2)); // Peripheral Bp_pPMC->PMC_PCER = 1<<AT91C_ID_SPI;p_pSPI->SPI_CR=AT91C_SPI_SPIEN ; //允许SPI口p_pSPI->SPI_MR=(AT91C_SPI_MSTR|AT91C_SPI_PS_VARIABLE|AT91C_SPI_PCSDEC|AT91C_SPI_MODFDIS|AT91C_SPI_DLYBCS); //SPI配置为主机模式,不分频,可变外设,片选与译码器相连,禁止错误检测p_pSPI->SPI_CSR[0]=(AT91C_SPI_CPOL|AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_16|(100<<8)|AT91C_SPI_DLYBS|AT91C_SPI_DLYBCT);//16位数据,传输完成后片选保持,SPCK为40M/100,传输前延时255,连续传输延时255 AT91C_SPI_SCBR=100p_pSPI->SPI_CSR[1]=(AT91C_SPI_CPOL|AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_16|(100<<8)|AT91C_SPI_DLYBS|AT91C_SPI_DLYBCT);p_pSPI->SPI_PTCR = (AT91C_PDC_RXTEN | AT91C_PDC_TXTEN);//编译时好像可以不用使能PDC也可以。
}SPI发送数据函数:void SPI_Write(AT91S_SPI *spi, unsigned int pcs, unsigned short data){// Discard contents of RDR register//volatile unsigned int discard = spi->SPI_RDR;// Send datawhile ((spi->SPI_SR & AT91C_SPI_TXEMPTY)==0);spi->SPI_TDR = data | SPI_PCS(pcs);while ((spi->SPI_SR & AT91C_SPI_TDRE) == 0);}// Calculate the PCS field value given the chip select NPCS value//#define SPI_PCS(npcs) ((~(1 << npcs) & 0xF) << 16)#define SPI_PCS(pcs) (((pcs) & 0xF) << 16)这行是我改的用于ARM设计需要。
2、SSC配置笔记m_pSSC->SSC_RCMR = 0x0f000502 ;//时钟来自RK引脚(0x2),CKO=0,CKI=0,start 0x5(检测TF上升沿),STDLY=0,period=15,每 2 x(PERIOD+1)(32)个发送时钟产生一个 PERIOD 信号。
m_pSSC->SSC_RFMR = 0x0000009f;//m_pSSC->SSC_TFMR = 0x0010009f;//DATLEN=0x1f,数据位长DATLEN+1(32位),DATDEF=0,MSBF=1,DATNB=0,传输一个数据字;FSLEN=0;FSOS=0x1,负脉冲;FSDEN=0,TD 驱动到默认值;FSDGE=0x0,正沿检测;m_pSSC->SSC_TCMR = 0x0f000401;//RK时钟 ,CKO=0,CKI=0(数据下降沿移出),START=0x4(检测TF下降沿),STTDLY=0,PERIOD=15,每 2 x(PERIOD+1)(32)个发送时钟产生一个 PERIOD 信号。
PDC配置顺序:void SSCHandler(void){ volatile unsigned int status;//* Get status and acknowledge ITstatus = m_pSSC->SSC_SR;//if(( status &AT91C_SSC_ENDTX)==4)m_pSSC->SSC_PTCR = AT91C_PDC_TXTDIS|AT91C_PDC_RXTDIS;//m_pSSC->SSC_RNPR=(unsigned int)RxBuff;//赋接收缓冲区起始地址; //m_pSSC->SSC_RNCR=64;//open pdc receivem_pSSC->SSC_TNPR=(unsigned int)TxBuff;//赋发送缓冲区起始地址; m_pSSC->SSC_TNCR=64;//open pdc transmitm_pSSC->SSC_PTCR = AT91C_PDC_TXTEN|AT91C_PDC_RXTEN;m_pAIC->AIC_EOICR=0;// Set End of Interrupt Command Register/*if((status&AT91C_SSC_ENDRX)){m_pSSC->SSC_PTCR = AT91C_PDC_TXTDIS|AT91C_PDC_RXTDIS;m_pSSC->SSC_RNPR=(unsigned int)TxBuff;//赋发送缓冲区起始地址; m_pSSC->SSC_RNCR=64;//open pdc transmitm_pSSC->SSC_PTCR = AT91C_PDC_TXTEN|AT91C_PDC_RXTEN;}*///*AT91C_AIC_EOICR=0;}void SSC_PDC_Init(void){// AT91F_AIC_CfgPMC();//开启AIC时钟,不用特意开启,默认是开启的;AT91F_SSC_CfgPIO();// SSC的PIO配置AT91F_SSC_CfgPMC(); /* Enable MCK clock */m_pSSC->SSC_CR = AT91C_SSC_SWRST|AT91C_SSC_TXDIS|AT91C_SSC_RXDIS; //SSC Reset AT91F_PDC_Close((AT91PS_PDC) &(m_pSSC->SSC_RPR));//Clear Transmit and Receive PDC Countersm_pAIC->AIC_IDCR |= 1;//disable FIQ interruptm_pAIC->AIC_DCR=1;//AIC_DEBUG的PROT=1,(The Protection Mode is enabled)//GMSK: General Mask=0 0 = The nIRQ and nFIQ lines are normally controlled by the AIC.// Configure SSC in Transmit modem_pSSC->SSC_CMR = 0x1;// Configure clock frequencym_pSSC->SSC_RCMR = 0x0f000502 ;//时钟来自RK引脚(0x2),CKO=0,CKI=0,start 0x5(检测TF上升沿),STDLY=0,period=15,每 2 x(PERIOD+1)(32)个发送时钟产生一个 PERIOD 信号。
m_pSSC->SSC_RFMR = 0x0000009f;//m_pSSC->SSC_TFMR = 0x0010009f;//DATLEN=0x1f,数据位长DATLEN+1(32位),DATDEF=0,MSBF=1,//DATNB=0,传输一个数据字;FSLEN=0;FSOS=0x1,负脉冲;FSDEN=0,TD驱动到默认值;FSDGE=0x0,正沿检测;//----------------------------------------------------------------------// This interrupt occure when one buffer is sent at reload the SCC register//* Configure AIC controller to handle SSC interruptsm_pAIC->AIC_ICCR = 0xFFFFFFFF;//Firstly Clear all interruptsAT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_SSC, SSC_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,SSCHandler);AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SSC);//Enable the SSC interrupt;m_pSSC->SSC_IDR = 0xfffb;AT91F_SSC_EnableIt(AT91C_BASE_SSC, AT91C_SSC_ENDTX);//AT91F_SSC_EnableIt(AT91C_BASE_SSC, AT91C_SSC_TXBUFE);//Enable TXBUFF interrupt;//---Configure the PDC,PDC sendFrame------//AT91F_PDC_SetTx ((AT91PS_PDC) &(m_pSSC->SSC_RPR), (char *)TxBuff,64);//AT91F_PDC_SetNextTx ((AT91PS_PDC) &(m_pSSC->SSC_TPR), (char *)0,0);AT91F_PDC_SetTx ((AT91PS_PDC) &(m_pSSC->SSC_RPR), (char *)TxBuff1,66);AT91F_PDC_SetNextTx ((AT91PS_PDC) &(m_pSSC->SSC_RPR), (char *)0,0);//m_pSSC->SSC_TPR=(unsigned int)TxBuff;//赋发送缓冲区起始地址;//m_pSSC->SSC_TCR=64;//open pdc transmit//m_pSSC->SSC_TNPR=0;//赋下一发送缓冲区起始地址//m_pSSC->SSC_TNCR=0;m_pSSC->SSC_RPR=(unsigned int)RxBuff;//赋接收缓冲区起始地址;m_pSSC->SSC_RCR=64;//open pdc receivem_pSSC->SSC_RNPR=0;//赋下一接收缓冲区起始地址m_pSSC->SSC_RNCR=0;//AT91F_PDC_EnableTx ((AT91PS_PDC) &(m_pSSC->SSC_RPR));m_pSSC->SSC_PTCR = AT91C_PDC_TXTEN|AT91C_PDC_RXTEN;//使能SSC的PDC 发送与接收//m_pSSC->SSC_TCMR = 0x0f000501;//RK时钟 ,CKO=0,CKI=0,START=0x5(检测TF上升沿),STTDLY=0,PERIOD=16,每 2 x(PERIOD+1)(32)个发送时钟产生一个 PERIOD 信号。