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]);
}
}
- at91sam7x256之SPI0与SPILCD
- at91sam7x256之gpio与串口 uart0
- at91sam7x256之串口uart0设置之二
- at91sam7x256与ads1256/ads1255的SPI通讯
- at91sam7x256之IIC(TWI)实验_PCF8563_AT24C02
- AT91SAM7X256操作外部Flash
- 【LPC54100】SPI0驱动TFT LCD
- loongson 1B spi0 简单编程
- nrf51822 --- TWI0和SPI0 TWI1 SPI1
- KEIL加jlink调试at91sam7x256之一
- 全志R16平台SPI0接口的验证(分色排版)
- 全志R16平台SPI0接口的验证V1.1(分色排版)
- 07打开r40m平台Android6.0下验证SPI0(分色排版)
- 基于Atmel的arm7芯片at91sam7x256的OpenTcp/Ip协议的完全移植
- 外部FLASH AT45DB642D的读写说明及AT91SAM7X256下C实现
- 全志a33下生成设备节点/dev/spi0.0的步骤(全志a20下生成/dev/spidev2.0)
- 人生之与游戏
- Android 之)}; 与 }; 的
- at91sam7x256之gpio与串口 uart0
- 网速好慢哦
- at91sam7x256之串口uart0设置之二
- Web网站的性能测试工具
- VBA listview控件
- at91sam7x256之SPI0与SPILCD
- winxp与Ubuntu 9双系统之硬盘安装
- 关于“灵图天行者9 PC 导航伴侣零售版 破解版 ”不能用(需要重新注册)的解决办法
- DataRelation
- 今天来这里安家了
- 内存碎片产生原因及处理
- ASP.NET中防止页面多次提交的代码实现
- Enable sa account using sqlcmd
- 源码网站集合