历史上的今天
今天是:2025年04月15日(星期二)
2018年04月15日 | ARM9的SPI
2018-04-15 来源:eefocus
实验前须知:
SPI的原理:
注:
CLK传输时钟
MISO主机输入从机输出
MOSI主机输出从机输入
CS片选信号,由于SPI控制器可以外接多个SPI设备,所以这个用于选中SPI设备。
SPI的操作流程大体如下图所示:
实验的目的:
用s3c2440的SPI控制器操作SPI总线上的两个设备,分别是OLED和FLASH
实验的源程序:
07th_spi_i2c_adc_mini2440_tq2440_spi_controller.rar
实验的问题总结:
1>我们主要分析一下s3c2440_spi.c这个文件
/*************************************s3c2440_spi.c**********************************
#include "s3c24xx.h"
/* SPI controller */
static void SPI_GPIO_Init(void)
{
/* GPG1 OLED_CSn output
* GPG10 FLASH_CSn output
*/
GPGCON &= ~((3<<(1*2)) | (3<<(10*2)));
GPGCON |= (1<<(1*2)) | (1<<(10*2));
GPGDAT |= (1<<1) | (1<<10);
/*
* GPF3 OLED_DC output
* GPE11 SPIMISO
* GPE12 SPIMOSI
* GPE13 SPICLK
*/
GPFCON &= ~(3<<(3*2));
GPFCON |= (1<<(3*2));
GPECON &= ~((3<<(11*2)) | (3<<(12*2)) | (3<<(13*2)));
GPECON |= ((2<<(11*2)) | (2<<(12*2)) | (2<<(13*2)));
}
void SPISendByte(unsigned char val)
{
while (!(SPSTA0 & 1));
SPTDAT0 = val;
}
unsigned char SPIRecvByte(void)
{
SPTDAT0 = 0xff;
while (!(SPSTA0 & 1));
return SPRDAT0;
}
static void SPIControllerInit(void)
{
/* OLED : 100ns, 10MHz
* FLASH : 104MHz
* 取10MHz
* 10 = 50 / 2 / (Prescaler value + 1)
* Prescaler value = 1.5 = 2
* Baud rate = 50/2/3=8.3MHz
*/
SPPRE0 = 2;
SPPRE1 = 2;
/* [6:5] : 00, polling mode
* [4] : 1 = enable
* [3] : 1 = master
* [2] : 0
* [1] : 0 = format A
* [0] : 0 = normal mode
*/
SPCON0 = (1<<4) | (1<<3);
SPCON1 = (1<<4) | (1<<3);
}
void SPIInit(void)
{
/* 初始化引脚 */
SPI_GPIO_Init();
SPIControllerInit();
}
***********************************s3c2440_spi.c***************************************/
在这个文件中,我们主要分析一下SPISendByte()和SPIRecvByte(),
从这两个函数中,我们可以很清晰地知道SPI的操作是非常简单的。这些操作就是根据上述那个流程图来的。
由于我们的SPI总线上没有接MMC或SD,所以步骤3,4,10都不需要。而在接收数据时,我们选择了接收数据(1)的方式。
上一篇:STM32的LED灯实验
下一篇:ARM9的IIC
史海拾趣
|
有人说CPLD资源使用过多会发热严重,影响稳定性。 现有一项目准备做PCB了,有一EPM7128的宏单元用了88%引脚用了86%,不知对稳定性是否真的有影响?以前的项目都没用过这么多的。 请有此类经验的同仁给点意见。。。… 查看全部问答> |
|
笔记本电脑进水,键盘回车键失灵,最关键的键啊,已经很长时间了,不要告诉我晾干什么的方法。用了个keyswap用alt键代替回车,就这样凑合用。现在问题,那个keyswap是更改系统注册表实现的,必须进入xp系统后(到登陆画面)才可以使用。在此以前, ...… 查看全部问答> |
|
北京旋极 高薪急招 高级税控软件工程师 职责: 负责税控项目系统软件的技术研发。 要求: 1、有完整税控项目研发的经验。 2、精通税控系统的各项技术。 3、诚信健康 联系:hr@watertek.com … 查看全部问答> |
|
最近使用stmf103做一个信号采集的实验板,觉得用usb传数据比较方便(主要是笔记本上都不带串口啊)。比较后打算用usb的虚拟串口功能比较好。有主机端的驱动程序,又有设备端的例程。 但是用起来有很多问题。因为是实时 ...… 查看全部问答> |
|
我把STM8 固件库中的TIME1触发 ADC2 的列程,翻译成 TIME1触发ADC1,可失败了!请大家帮我找找原因! void main(void) { /* Init GPIO for ADC2 */ GPIO_Init(GPIOB, GPIO_PIN_3, GPIO_MODE_IN_FL_ ...… 查看全部问答> |
|
zstack组网距离远远小于数据传输距离,如何实现远距离组网? 现在有两个思路一个是扩大组网距离但似乎实现起来比较困难另一个是去掉组网过程,使一定数量的节点启动后就连接一个网络,这样能避免组网距离太近的缺陷实际应用中各个节点都安装好,开机后组网,组网后可正常使用但现在的情况组网距离很近,加了CC ...… 查看全部问答> |




