at91sam7x256之SPI0与SPILCD

来源:互联网 发布:第5次人口普查的数据 编辑:程序博客网 时间:2024/05/04 11:03

又搞了半天,液晶模块显示功能搞定了。

LCD应该叫LCM,反正都是叫液晶模块,带字库的液晶12232E。

液晶与at91sam7x256连接是通过串口SPI连接的,这样节省了不少管脚,连线也少了。

基本上是开发板iar例子搬过来的,但是设置有些不同:

1,io初始化不同,因为iar例子里面都是开发板厂家自己写的程序,很乱,看不清楚。

    我自己对spi端口进行了初始化,也用了lib_at91sam7x256.h里的库函数,两个都可以用。

2,库函数用的不一样,

3,刚开始不行,是因为片选设置的不对

4,几个关键设置:

 AT91F_SPI0_CfgPIO ();
 AT91F_SPI0_CfgPMC ();

AT91F_SPI_CfgMode (AT91C_BASE_SPI0, // pointer to a SPI controller
AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | SPI_PCS(3)) ;       // mode register

AT91F_SPI_CfgPCS ( AT91C_BASE_SPI0, // pointer to a SPI controller
                                         3); // PCS of the Device
 SPI0_BASE->SPI_CR=AT91C_SPI_SPIEN;//0X01;//ENABLE SPI0
 AT91F_PDC_Open(AT91C_BASE_PDC_SPI0);//这个是干什么用的,还没有搞明白,呆会好好研究

对SPI我基本上还是一知半解,还要深入一些啊。

 代码:

#include <AT91SAM7X256.H>
#include <Lib_AT91SAM7X256.H>

 

#define BOARD_LBEN (1<<12)
#define SPI0CS1 (1<<13)
#define SPI0CS2 (1<<14)
#define SPI0CS3 (1<<15)
#define MOSI0 (1<<16)
#define MISO0 (1<<17)
#define SCLK0 (1<<18)
AT91PS_SPI  SPI0_BASE=AT91C_BASE_SPI0;

#define SPI_PCS(npcs)       ((~(1 << npcs) & 0xF) << 16)

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
// AT91F_SPI0_CfgPIO ();
// AT91F_SPI0_CfgPMC ();
// SPI0_BASE->SPI_CR=0X82;//REST, DISABLE
// SPI0_BASE->SPI_MR=0X0600000B;//MCK/N   直接外设,可变外设,主模式
 
 AT91F_SPI_CfgMode (AT91C_BASE_SPI0, // pointer to a SPI controller
      AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | SPI_PCS(3)) ;       // mode register

 //SPI_RDR//接收寄存器
 //SPI_TDR//发送寄存器
 //SPI_IER//中断寄存器
 //SPI_CSR0~3片选寄存器 
    SPI0_BASE->SPI_CSR[0]=0X0F0FFF08;
 SPI0_BASE->SPI_CSR[1]=0X0F0FFF08;
 SPI0_BASE->SPI_CSR[2]=0X0F0FFF08;
 SPI0_BASE->SPI_CSR[3]=0X0F0FFF08;
 AT91F_SPI_CfgPCS ( AT91C_BASE_SPI0, // pointer to a SPI controller
       3); // PCS of the Device
 SPI0_BASE->SPI_CR=AT91C_SPI_SPIEN;//0X01;//ENABLE SPI0
 AT91F_PDC_Open(AT91C_BASE_PDC_SPI0);
}
//-----------------------------------------------------------------
void SPI_Write(AT91PS_SPI spi, unsigned int npcs, unsigned short data)
{
    // Discard contents of RDR register
    //volatile unsigned int discard = spi->SPI_RDR;

    // Send data
    while ((spi->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
    spi->SPI_TDR = data | SPI_PCS(npcs);
    while ((spi->SPI_SR & AT91C_SPI_TDRE) == 0);
}

void spi_send_data(unsigned char *sdata, unsigned char slen)
{
   int i=0;
    for ( i = 0; i < slen; i++)
    {
        SPI_Write(AT91C_BASE_SPI0, 3, sdata[i]);
    }
}

 

原创粉丝点击