本帖最后由 强仔00001 于 2015-4-17 09:26 编辑
今天在看文档时注意到USART还支持SPI模式,然后立马撸起代码,把GUI的部分的SPI改成了USART的SPI模式,并且成功了。如官方的手册的USART特性说明:
可以看出USART的功能很强大,注意到了红色方框的内容,说明了USART支持SPI模式。最大的频率只能到达MCK(系统主时钟的6分频),假如单片机主频MCK是120M,SPI的速率最大也就是20M。在SAM4中有3个SPI模块,分别是一个SPI,两个USART下的SPI模式,分别由USART0和USART1产生。下图是USART的功能模块图,可以看出功能强大。
在SAM4S中USART0和USART1的管脚分布情况如下表:
USART和SPI管脚的对应图标,大家不要看错呀,master和slave下的管脚对应情况是有所不同的。如下图标:
SPI的四种模式如下图:这四种模式选择要根据你所要通信的器件所支持的方式而选择。
四种方式的时序图:
我这次也是使用了Atmel的ASF库的函数来进行程序的设计。 总的来说,分这几部走: (1)管脚的配置部分:把管脚设置为USART模式,代码如下: gpio_configure_pin(PIO_PA22_IDX,(PIO_PERIPH_A | PIO_DEFAULT)); gpio_configure_pin(PIO_PA23_IDX,(PIO_PERIPH_A | PIO_DEFAULT)); (2)USART_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 TFT屏幕的底层SPI驱动的修改: 这是之前的SPI(非USART的)驱动: uint8_t SPI_WriteByte(uint8_t Byte) { struct spi_device device = {.id = SSD1306_CS_PIN}; spi_select_device(SSD1306_SPI, &device); spi_write_single(SPI, Byte); spi_deselect_device(SSD1306_SPI, &device); } 这是现在的USART_SPI(USART的)驱动: uint8_t SPI_WriteByte(uint8_t Byte) { buffer[0] = Byte; usart_spi_write_packet(USART1, buffer, 1);
} 这次启用了GUI的窗体功能,要想打开窗体功能,就要配置下GUIConf.h文件。 把一下这句: #define GUI_WINSUPPORT 0 /* Window manager package available */ 改为: #define GUI_WINSUPPORT 1 /* Window manager package available */ 代码从网上找的:
- struct usart_spi_device USART_SPI_DEVICE_EXAMPLE = {
- /* Board specific select ID. */
- .id = 1
- };
- int main(void)
- {
- // Initialize clocks.
- sysclk_init();
- // Initialize GPIO states.
- board_init();
- //初始化USART的SPI模式
- gpio_configure_pin(PIO_PA22_IDX, (PIO_PERIPH_A | PIO_DEFAULT));
- gpio_configure_pin(PIO_PA23_IDX, (PIO_PERIPH_A | PIO_DEFAULT));
- usart_spi_init(USART1);
- usart_spi_setup_device(USART1, &USART_SPI_DEVICE_EXAMPLE,SPI_MODE_0, 20000000, 0);
- usart_spi_enable(USART1);
-
-
- const char FRAM[]={"Assistant Of The Car"};
- const char button[]={"START"};
- const char button1[]={"STOP"};
- const char button2[]={"RESET"};
- const char button3[]={"SEND_MOD"};
- const char button4[]={"RECE_MOD"};
- const char button5[]={"-"};
- const char button6[]={"+"};
- const char Text[]={"AD1"};
- const char Text1[]={"AD2"};
- const char Text2[]={"AD3"};
- const char Text3[]={"AD4"};
- const char Text4[]={"duty ratio"};
- const char Text5[]={"P"};
- const char Text6[]={"I"};
- const char Text7[]={"D"};
- BUTTON_Handle Button[11];//°′?¥???t
- PROGBAR_Handle ProgBar[4];//???èì????t
- EDIT_Handle Edit[10];//±à? ???t
- TEXT_Handle text[10];//??±????t
- FRAMEWIN_Handle FramWin;
- SLIDER_Handle Slide[4];//???ˉ???t
- GUI_Init();
- WM_Init();
- GUI_SetBkColor(GUI_BLACK);
- GUI_Clear();//???á
- FramWin=FRAMEWIN_Create(FRAM,0,WM_CF_SHOW,10,10,300,230);
- FRAMEWIN_SetActive(FramWin,1);//?¤???a???ò?ü
- //Text=TEXT_Create(60,60,80,80,4,WM_CF_SHOW,bb,TEXT_CF_LEFT);
- GUI_Exec();
- //WM_SetDesktopColor(GUI_BLACK);//éè??×à??μ???é?
- Button[0]=BUTTON_Create(20,30,40,20,1,WM_CF_SHOW);
- BUTTON_SetBkColor(Button[0],1,GUI_BLUE);//éè??°′?¥°′??ê±μ???é?
- BUTTON_SetText(Button[0],button);//°′?¥1
- Button[1]=BUTTON_Create(70,30,40,20,2,WM_CF_SHOW);
- BUTTON_SetBkColor(Button[1],1,GUI_BLUE);//éè??°′?¥°′??ê±μ???é?
- BUTTON_SetText(Button[1],button1);//°′?¥2
- Button[2]=BUTTON_Create(120,30,40,20,3,WM_CF_SHOW);
- BUTTON_SetBkColor(Button[2],1,GUI_BLUE);//éè??°′?¥°′??ê±μ???é?
- BUTTON_SetText(Button[2],button2);//°′?¥3
- Button[3]=BUTTON_Create(170,30,60,20,4,WM_CF_SHOW);
- BUTTON_SetBkColor(Button[3],1,GUI_BLUE);//éè??°′?¥°′??ê±μ???é?
- BUTTON_SetText(Button[3],button3);//°′?¥3
- Button[4]=BUTTON_Create(240,30,60,20,5,WM_CF_SHOW);
- BUTTON_SetBkColor(Button[4],1,GUI_BLUE);//éè??°′?¥°′??ê±μ???é?
- BUTTON_SetText(Button[4],button4);//°′?¥3
- GUI_Exec();
- text[0]=TEXT_Create(20,60,20,20,6,WM_CF_SHOW,Text,TEXT_CF_LEFT);
- Edit[0]=EDIT_Create(40,60,35,20,7,4,WM_CF_SHOW);
- EDIT_SetDecMode(Edit[0],0,0,5000,0,0);
- text[1]=TEXT_Create(80,60,20,20,8,WM_CF_SHOW,Text1,TEXT_CF_LEFT);
- Edit[1]=EDIT_Create(100,60,35,20,9,4,WM_CF_SHOW);
- EDIT_SetDecMode(Edit[1],0,0,5000,0,0);
- text[2]=TEXT_Create(140,60,20,20,10,WM_CF_SHOW,Text2,TEXT_CF_LEFT);
- Edit[2]=EDIT_Create(160,60,35,20,11,4,WM_CF_SHOW);
- EDIT_SetDecMode(Edit[2],0,0,5000,0,0);
- text[3]=TEXT_Create(200,60,20,20,12,WM_CF_SHOW,Text3,TEXT_CF_LEFT);
- Edit[3]=EDIT_Create(220,60,35,20,13,4,WM_CF_SHOW);
- EDIT_SetDecMode(Edit[3],0,0,5000,0,0);
- GUI_Exec();
- text[4]=TEXT_Create(20,90,70,20,12,WM_CF_SHOW,Text4,TEXT_CF_LEFT);
- Button[5]=BUTTON_Create(95,90,15,20,1,WM_CF_SHOW);
- BUTTON_SetBkColor(Button[5],1,GUI_BLUE);//éè??°′?¥°′??ê±μ???é?
- BUTTON_SetText(Button[5],button5);//°′?¥1
- ProgBar[0]=PROGBAR_Create(115,90,150,20,WM_CF_SHOW);
- PROGBAR_SetBarColor(ProgBar[0],0,GUI_BLUE);
- PROGBAR_SetBarColor(ProgBar[0],1,GUI_RED);
- PROGBAR_SetValue(ProgBar[0],10);
- Button[6]=BUTTON_Create(270,90,15,20,1,WM_CF_SHOW);
- BUTTON_SetText(Button[6],button6);//°′?¥1
- GUI_Exec();
- text[5]=TEXT_Create(20,120,15,20,13,WM_CF_SHOW,Text5,TEXT_CF_LEFT);
- Button[7]=BUTTON_Create(40,120,20,20,1,WM_CF_SHOW);
- BUTTON_SetText(Button[7],button5);//°′?¥1
- Slide[0]=SLIDER_Create(65,120,170,20,0,0,WM_CF_SHOW,0);//????×′ì?
- SLIDER_SetRange(Slide[0],0,100);
- SLIDER_SetValue(Slide[0],50);
- SLIDER_SetWidth(Slide[0],5);
- Button[8]=BUTTON_Create(240,120,20,20,1,WM_CF_SHOW);
- BUTTON_SetText(Button[8],button6);
- Edit[4]=EDIT_Create(265,120,35,20,15,3,WM_CF_SHOW);
- EDIT_SetDecMode(Edit[4],0,0,100,0,0);//P
- text[6]=TEXT_Create(20,150,15,20,13,WM_CF_SHOW,Text6,TEXT_CF_LEFT);
- Button[8]=BUTTON_Create(40,150,20,20,1,WM_CF_SHOW);
- BUTTON_SetText(Button[8],button5);//°′?¥1
- Slide[1]=SLIDER_Create(65,150,170,20,0,0,WM_CF_SHOW,0);//????×′ì?
- SLIDER_SetRange(Slide[1],0,100);
- SLIDER_SetValue(Slide[1],50);
- SLIDER_SetWidth(Slide[1],5);
- Button[9]=BUTTON_Create(240,150,20,20,1,WM_CF_SHOW);
- BUTTON_SetText(Button[9],button6);
- Edit[5]=EDIT_Create(265,150,35,20,15,3,WM_CF_SHOW);
- EDIT_SetDecMode(Edit[5],0,0,100,0,0);//I
- text[7]=TEXT_Create(20,180,15,20,13,WM_CF_SHOW,Text7,TEXT_CF_LEFT);
- Button[9]=BUTTON_Create(40,180,20,20,1,WM_CF_SHOW);
- BUTTON_SetText(Button[9],button5);//°′?¥1
- Slide[2]=SLIDER_Create(65,180,170,20,0,0,WM_CF_SHOW,0);//????×′ì?
- SLIDER_SetRange(Slide[2],0,100);
- SLIDER_SetValue(Slide[2],50);
- SLIDER_SetWidth(Slide[2],5);
- Button[10]=BUTTON_Create(240,180,20,20,1,WM_CF_SHOW);
- BUTTON_SetText(Button[10],button6);
- Edit[5]=EDIT_Create(265,180,35,20,15,3,WM_CF_SHOW);
- EDIT_SetDecMode(Edit[5],0,0,100,0,0);//D
- GUI_Exec();
- /*
- GUI_Init();
- GUI_SetBkColor(GUI_RED);
- GUI_Clear();
- // GUI_Delay(10);
- GUI_SetFont(&GUI_Font32B_ASCII);
- //GUI_DispString("Hello World!");
- GUI_DispString("qiangzai00001\n"
- "13426742163\n"
- "963775289\n"
- "wuyi \n"
- "jiangmen\n"
- "chinese\n\n"
- "www.eeboard.com\n");
- */
- // TFT_Init();
- while (true)
- {
-
-
- }
-
- }
复制代码效果图:
源代码分享:
SAM4的USART_SPI模式.zip
(5.69 MB, 下载次数: 2, 售价: 1 与非币)
|