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<<9)|(1<<12)|(1<<15)|SPI0CS1 |SPI0CS2 |SPI0CS3;//PA16,PA17,PA18设置为输出
GPIO_A->PIO_SODR |=(1<<9)|(1<<12)|(1<<15)|SPI0CS1 |SPI0CS2 |SPI0CS3; //PA16,PA17,PA18设置为高
*AT91C_PMC_PCER |= (unsigned int)1<<AT91C_ID_SPI0; //允许US0口的时钟
GPIO_A->PIO_PDR |=MOSI0 |MISO0 |SCLK0; //PA16,PA17,PA18设为外设
GPIO_A->PIO_ASR |=MOSI0 |MISO0 |SCLK0; //PA16,PA17,PA18设为外设A
//开发板片选用
GPIO_A->PIO_PDR |=SPI0CS1 |SPI0CS2 |SPI0CS3; //PA16,PA17,PA18设为外设
GPIO_A->PIO_ASR |=SPI0CS1 |SPI0CS2 |SPI0CS3; //PA16,PA17,PA18设为外设A
//复位SPI0
AT91F_SPI_Reset(AT91C_BASE_SPI0);
AT91F_SPI_Reset(AT91C_BASE_SPI0);
//配置 SPI0 工作在主模式--固定外设--NPCS3片选 //如果选用不同的片选可在此处修改
AT91F_SPI_CfgMode(AT91C_BASE_SPI0, AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | (0x7<<16));// |AT91C_SPI_FDIV
//* 配置8 位数据位 NPCS3-片选3
AT91F_SPI_CfgCs(AT91C_BASE_SPI0,3, AT91C_SPI_BITS_8|AT91C_SPI_CSAAT|((AT91B_MCK/(2*400000)) << 8));
//AT91C_SPI_NCPHA|AT91C_SPI_CPOL,按照ADS1255数据手册上 CPHA=1,CPOL=0;AT91C_SPI_NCPHA是需要的,但是实际如果AT91C_SPI_NCPHA这位加上的话通讯是不正常的,现在设置是CPHA=0,CPOL=0;这个还需要再研究一下数据手册的内容。
时钟频率按照at91sam7x256数据手册上应该是
//* 启动 SPI0
AT91F_SPI_Enable(AT91C_BASE_SPI0);
//使用pdc,目前程序没有使用PDC,所以下面代码屏蔽掉了
// AT91F_PDC_Open(AT91C_BASE_PDC_SPI0);
// AT91C_BASE_SPI0->SPI_PTCR = AT91C_PDC_TXTEN + AT91C_PDC_RXTEN;
}
//-----------------------------------------------------------------
//spi写一个字节,写前后我都读了一次spi——SPI_RDR寄存,如果不读,读写ADS1255寄存器就不对,这个是我对spi通讯协议的基本内容不太理解,先这样写了,反正能用。
void SPI_Write(AT91PS_SPI spi, unsigned int npcs, unsigned int data)
{
unsigned int temp=spi->SPI_RDR;
temp=data | SPI_PCS(npcs);
while ((spi->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
spi->SPI_TDR =temp;
while ((spi->SPI_SR & AT91C_SPI_TDRE) == 0);
temp=spi->SPI_RDR;
}
//------------------------------------------------------------------------
//从spi读出一个字节数据,读取之前先要写spi->SPI_TDR,不然读的数据是FF,或者不能读。
unsigned short SPI_Read(AT91S_SPI *spi)
{
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 <AT91SAM7X256.H>
#inc

本文档详细介绍了如何使用AT91SAM7X256的SPI0接口与TI公司的ADS1256/ADS1255进行通讯。内容包括SPI0的初始化、ADS1256/ADS1255的操作函数,如读写数据、设置同步和唤醒等。同时,文中提到了在实现过程中遇到的问题及解决方法,如SPI读写操作的注意事项、波特率匹配和硬件检查等。


2084

被折叠的 条评论
为什么被折叠?



