[资料] 原创atmel sam4s16c教程 之spi

[复制链接]

版主

发表于 2016-10-20 17:09:32   1417 查看 4 回复 显示全部楼层 倒序浏览
分享
本帖最后由 lee_st 于 2016-10-21 11:35 编辑

按项目的要求,在原有的基础上增加了定时器功能
仔细研究Datasheet中关于spi的部分

框图见附图





最大的频率只能到达MCK(系统主时钟的6分频),假如单片机主频MCK120MSPI的速率最大也就是20M。在SAM4中有3SPI模块,分别是一个SPI,两个USART下的SPI模式,分别由USART0USART1产生。
见附图
SPI的四种模式如下图:这四种模式选择要根据你所要通信的器件所支持的方式而选择。
见附图

代码分这几部走:
1)管脚的配置部分:把管脚设置为USART模式,代码如下:
gpio_configure_pin(PIO_PA22_IDX,(PIO_PERIPH_A | PIO_DEFAULT));
gpio_configure_pin(PIO_PA23_IDX,(PIO_PERIPH_A | PIO_DEFAULT));
2USART_SPI的参数配置,代码如下:
usart_spi_init(USART1);//初始化SPI,主要是使能USART的时钟
//设置SPI的传输数据的模式和频率,这里我设置到最大20M,单片机的主频为120M
usart_spi_setup_device(USART1,&USART_SPI_DEVICE_EXAMPLE,SPI_MODE_0, 20000000, 0);
usart_spi_enable(USART1);//使能SPI
oled的底层SPI驱动的修改:

本项目的spi通讯有2个slave,eeprom和oled
分别通过2个片选控制。

代码如下:
spi初始化
void spi_master_initialize(void)
{
        // Configure an SPI peripheral.
        spi_enable_clock(SPI);
        spi_disable(SPI);
        spi_reset(SPI);
        spi_set_lastxfer(SPI);
        spi_set_master_mode(SPI);
        spi_disable_mode_fault_detect(SPI);
        spi_set_peripheral_chip_select_value(SPI, SPI_CHIP_SEL);
        spi_set_clock_polarity(SPI, SPI_CHIP_SEL, SPI_CLK_POLARITY);
        spi_set_clock_phase(SPI, SPI_CHIP_SEL, SPI_CLK_PHASE);
        
        spi_set_bits_per_transfer(SPI, SPI_CHIP_SEL, SPI_CSR_BITS_12_BIT);  
        
        spi_set_baudrate_div(SPI, SPI_CHIP_SEL, 30);
        
        spi_set_transfer_delay(SPI, SPI_CHIP_SEL, SPI_DLYBS, SPI_DLYBCT);
        
        
        spi_set_clock_polarity(SPI, SPI_CHIP1_SEL, 0);
        spi_set_clock_phase(SPI, SPI_CHIP1_SEL, 1);
        spi_set_bits_per_transfer(SPI, SPI_CHIP1_SEL, SPI_CSR_BITS_8_BIT);
        
        spi_set_baudrate_div(SPI, SPI_CHIP1_SEL, 120); //EEPROM工作在1MHz

        spi_set_transfer_delay(SPI, SPI_CHIP1_SEL, SPI_DLYBS, SPI_DLYBCT);
        
        spi_enable(SPI);
        spi_set_peripheral_chip_select_value(SPI, SPI_CHIP_SEL);
}


void spi_read1(Spi *p_spi, uint16_t *spi_data)
{

        static uint32_t reg_value;

        reg_value = p_spi->SPI_RDR;

        *spi_data = (uint16_t) (reg_value & SPI_RDR_RD_Msk);

}

void write_data(uint8_t int_dat)  
{
        uint16_t flag = 0x300;
        uint16_t switch_dat;
        
        switch_dat = flag + int_dat;
        switch_dat = switch_dat * 2;
        spi_master_transfer(&switch_dat,1);
        
}

关于分别用在oled和eeprom,有时间整理一下再放上








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

实习生

发表于 2016-11-9 15:38:37  
SPI_CHIP_SEL是什么
回复

举报

版主

发表于 2016-11-10 08:55:36    楼主|
片选,,,,,,,,,
回复

举报

版主

发表于 2016-11-10 09:28:59    楼主|
一般宏定义都能直接看懂是什么
回复

点赞 举报

版主

发表于 2016-11-15 00:24:48    楼主|
也被推荐了,谢谢
回复

举报

高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区