at91sam7x256与ads1256/ads1255的SPI通讯 您所在的位置:网站首页 ads1255配置单端模式程序 at91sam7x256与ads1256/ads1255的SPI通讯

at91sam7x256与ads1256/ads1255的SPI通讯

2023-04-06 19:52| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有