at91sam7x256与ads1256/ads1255的SPI通讯 | 您所在的位置:网站首页 › ads1255配置单端模式程序 › at91sam7x256与ads1256/ads1255的SPI通讯 |
at91sam7x256通过SPI0控制SPI接口的LCD,按照开发板的iar例程,移植到keil中很轻松的搞定了。 可是at91sam7x256与TI公司的ads1256/ads1255通讯搞了两周始终有这样那样的问题, 现在通讯基本上正常了,当然还有些细节问题需要解决。 //at91sam7x256的SPI0初始化 void Init_SPI0(void){ GPIO_A->PIO_OER |=MOSI0 |MISO0 |SCLK0;//PA16,PA17,PA18设置为输出 GPIO_A->PIO_SODR |=MOSI0 |MISO0 |SCLK0; //PA16,PA17,PA18设置为高 //开发板片选用 GPIO_A->PIO_OER |=(1 unsigned int i; while ((spi->SPI_SR & AT91C_SPI_TXEMPTY) == 0); spi->SPI_TDR = 0xffff|0xb0000; while ((spi->SPI_SR & AT91C_SPI_RDRF) == 0); return spi->SPI_RDR & 0xffff;} //=================================================================== 下面是对ADS1255的操作函数 #include #include #include "main.h"#include "spi0_driver.h"#include "spi0_AD.h"#define DYDN (1 GPIO_A->PIO_SODR|=DYDN; } else { GPIO_A->PIO_CODR|=DYDN; }}void SendSPIByte(unsigned char ch){ SPI_Write(AT91C_BASE_SPI0, 2, ch); // 等待写结束 } unsigned short GetSPIByte(void){ return SPI_Read(AT91C_BASE_SPI0); // 等待读结束}//----------------------------------------------- //------------------------------------------------------------------------ long int read_data(void){ unsigned int i;// unsigned char send[]={0x01,0xff,0xff,0xff}; long int date=0; long hhh=0,mmm=0,lll=0; dydn=0; Set_Pin(dydn); //j=sizeof(send); SendSPIByte(0x01); for(i=0;i unsigned char send[]={0x01,0xff,0xff,0xff,0xfd}; long int date; int i,j; j=sizeof(send); for(i=0;i SendSPIByte(0xf0); } //--------------------------------------------------------------------------void set_wakeup(void){ SendSPIByte(0x00); } //--------------------------------------------------------------------------void set_standby(void){ SendSPIByte(0xfd); }//--------------------------------------------------------------------------void RESETADS1255(void){ dydn=0; Set_Pin(dydn); write_register(0X00,0X01); write_register(0X01,0X01); write_register(0X02,0X20); write_register(0X03,0Xf0); write_register(0X04,0XE0); dydn=0; Set_Pin(dydn); SendSPIByte(0xfE); }//--------------------------------------------------------------------------void set_sync(void){ SendSPIByte(0xfc); } //-----------------------写数据到选择的寄存器中----------------------------- void write_register(unsigned char addr,unsigned char date){ int i,j; unsigned char send[] = {0x50,0x00,0x00}; send[0] |= addr; send[2] |= date; j=sizeof(send); for(i=0;i int i,j; unsigned short send[] = {0x10,0x00}; send[0] |= addr; j=sizeof(send); for(i=0;i unsigned char SendBuf[0x100],CHK; int Index=0; int i; //---------------得到通道0的24位数据----------------- dydn=0; Set_Pin(dydn); write_register(0X01,0X08); ADV0[7]=ADV0[6]; ADV0[6]=ADV0[5]; set_sync(); ADV0[5]=ADV0[4]; ADV0[4]=ADV0[3]; ADV0[3]=ADV0[2]; set_wakeup(); ADV0[2]=ADV0[1]; ADV0[1]=ADV0[0]; ADV0[0]=read_data(); dydn=1; Set_Pin(dydn); //ADV0[0]=FAD0; FAD0=(ADV0[0]);//+ADV0[1]+ADV0[2]+ADV0[3]+ADV0[4]+ADV0[5]+ADV0[6]+ADV0[7])/8; if(FAD0 SendChar(SendBuf[i]); CHK-=SendBuf[i]; } SendChar(0xbb);} //================================================= //主函数。c #include #include "main.h"#include "UART0.H"#include"spi0_driver.h"#include "spilcd.h"#include "spi0_AD.h"#define LED1 (1 GPIO_A->PIO_PER =0XfFFFFFFF; GPIO_B->PIO_OER|=LED1; GPIO_B->PIO_OER|=LED2; GPIO_B->PIO_OER|=LED3; GPIO_B->PIO_OER|=LED4; GPIO_B->PIO_OER=0x7fffffff; GPIO_B->PIO_SODR=0x7fffffff; *AT91C_PMC_PCER|=0x08;}//----------------------------------------------------------------------------------------------------------------------------------------------void AT91F_LowLevelInit(void) { unsigned char i; // 1 Wait State necessary to work at 48MHz AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS; / // Init PMC Step 1. Enable Main Oscillator 使能主振荡时钟 // Main Oscillator startup time is board specific: // Main Oscillator Startup Time worst case (3MHz) corresponds to 15ms (0x40 for AT91C_CKGR_OSCOUNT field) / AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x40 PMC_PLLR = AT91C_CKGR_USBDIV_1 | AT91C_CKGR_OUT_0 | AT91C_CKGR_PLLCOUNT | (AT91C_CKGR_MUL & (72 PMC_SR & AT91C_PMC_LOCK) ); // Wait until the master clock is established for the case we already turn on the PLL while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );
/ // Init PMC Step 3. 配置MCK为PLL输出分频2,处理器时钟PCK等于MCK // Selection of Master Clock MCK (equal to Processor Clock PCK) equal to PLL/2 = 48MHz // The PMC_MCKR register must not be programmed in a single write operation (see. Product Errata Sheet) / /* */ AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; // 分频2 // Wait until the master clock is established while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;//选PLL为时钟 // Wait until the master clock is established while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );
/ // Disable Watchdog (write once register) / AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
// Init AIC: assign corresponding handler for each interrupt source //* AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler ; for (i = 1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (int) AT91F_Default_IRQ_handler ; } AT91C_BASE_AIC->AIC_SPU = (unsigned int) AT91F_Spurious_handler; */ }//----------------------------------------------------------------------------------------------------------------------unsigned long x[0xf];int main(){ unsigned int i=0; for(i=0;i |
CopyRight 2018-2019 实验室设备网 版权所有 |