main.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #include <stdarg.h>
  2. #include "yc11xx.h"
  3. #include "ycdef.h"
  4. #include "yc11xx_uart.h"
  5. #include "yc11xx_gpio.h"
  6. #include "yc11xx_spi.h"
  7. #define OLED_H_NUM 8
  8. #define OLED_WIDTH 128
  9. typedef struct{
  10. uint16_t SPID_TX_LEN;
  11. uint8_t *SPID_TX_ADDR;
  12. uint16_t SPID_RX_LEN;
  13. uint8_t * SPID_RX_ADDR;
  14. }SPI_Buff;
  15. typedef struct{
  16. uint8_t CLOCK_GPIO_NUM;
  17. uint8_t MOSI_GPIO_NUM;
  18. uint8_t MISO_GPIO_NUM;
  19. uint8_t CS_GPIO_NUM;
  20. }SPI_GPIO;
  21. #define UNDEF_GPIO 0xFF
  22. #define OLED_C_D_SELECT_GPIO 0x1c //gpio28
  23. #define GPIO_OLED_CONFIG_RES 0x1a //GPIO 26
  24. #define GPIO_OLED_CONFIG_A0 0x1d
  25. #define OLED_SH1106_SPI_CLOCK_GPIO 0x18 //GPIO 24
  26. #define OLED_SH1106_SPI_MOSI_GPIO 0x19 //GPIO 25
  27. #define OLED_SH1106_SPI_MISO_GPIO UNDEF_GPIO // undefine GPIO
  28. #define OLED_SH1106_SPI_CS_GPIO 0x17 //GPIO 23
  29. void gpio_output_high_level(uint8_t GPIO_num)
  30. {
  31. GPIO_SetGpioMultFunction(GPIO_num,GPCFG_OUTPUT_HIGH);
  32. }
  33. void gpio_output_low_level(uint8_t GPIO_num)
  34. {
  35. GPIO_SetGpioMultFunction(GPIO_num,GPCFG_OUTPUT_LOW);
  36. }
  37. #define GPIO_OLED_CONFIG_CLOCK GPIO_SetGpioMultFunction(OLED_SH1106_SPI_CLOCK_GPIO , GPCFG_SPID_SCK)
  38. #define GPIO_OLED_CONFIG_MOSI GPIO_SetGpioMultFunction(OLED_SH1106_SPI_MOSI_GPIO, GPCFG_SPID_MOSI)
  39. #define GPIO_OLED_CONFIG_MISO GPIO_SetGpioMultFunction(OLED_SH1106_SPI_MISO_GPIO, GPCFG_SPID_MISO)
  40. #define GPIO_OLED_CONFIG_CS GPIO_SetGpioMultFunction(OLED_SH1106_SPI_CS_GPIO , GPCFG_SPID_NCS)
  41. #define GPIO_OLED_DISABLE_CLOCK GPIO_SetGpioMultFunction(OLED_SH1106_SPI_CLOCK_GPIO, GPCFG_OUTPUT_HIGH )
  42. #define GPIO_OLED_DISABLE_MOSI GPIO_SetGpioMultFunction(OLED_SH1106_SPI_MOSI_GPIO, GPCFG_OUTPUT_HIGH )
  43. #define GPIO_OLED_DISABLE_MISO GPIO_SetGpioMultFunction(OLED_SH1106_SPI_MISO_GPIO , GPCFG_OUTPUT_HIGH)
  44. #define GPIO_OLED_DISABLE_CS GPIO_SetGpioMultFunction(OLED_SH1106_SPI_CS_GPIO, GPCFG_OUTPUT_HIGH)
  45. #define LCD_RS_CMD 0x00
  46. #define LCD_RS_DATA 0x01
  47. void clr_a0(void);
  48. void set_a0(void);
  49. void spi_write_data(unsigned char data);
  50. void spi_write_cmd(unsigned char cmd);
  51. void write_byte_lcd(unsigned char data, unsigned char cmd);
  52. void write_bytes_lcd(unsigned char* pdata, unsigned char len, unsigned char cmd);
  53. void clr_screen(void);
  54. void full_screen(void);
  55. void set_xy(unsigned char column, unsigned char page);
  56. void init_lcd(void);
  57. void SPI_LCD_Test(void);
  58. /*************************************SPI_OLED_TEST********************************/
  59. #define IO_TXA 8
  60. #define IO_RXA 9
  61. #define IO_TXB 10
  62. #define IO_RXB 11
  63. #define UARTBUFSIZE 128
  64. void UartxInit(USART_TypeDef UARTx)
  65. {
  66. USART_InitTypeDef USART_InitStruct ;
  67. USART_InitStruct.USART_BaudRate = UARTE_BAUDRATE_BAUDRATE_Baud115200;
  68. USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  69. USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  70. USART_InitStruct.USART_StopBits = USART_StopBits_1;
  71. USART_InitStruct.USART_Mode =USART_Mode_duplex;
  72. USART_InitStruct.USART_Parity = USART_Parity_Even ;
  73. USART_InitStruct.USART_RXLen = UARTBUFSIZE;
  74. USART_InitStruct.USART_TXLen = UARTBUFSIZE;
  75. if(UARTA == UARTx){
  76. GPIO_SetGpioMultFunction(IO_TXA,GPCFG_UART_TXD);
  77. GPIO_SetGpioMultFunction(IO_RXA,GPCFG_UART_RXD);
  78. }else if (UARTB == UARTx){
  79. GPIO_SetGpioMultFunction(IO_TXB,GPCFG_UARTB_TXD);
  80. GPIO_SetGpioMultFunction(IO_RXB,GPCFG_UARTB_RXD);
  81. }
  82. USART_Init(UARTx,&USART_InitStruct);
  83. }
  84. void debug_print(uint32_t data)
  85. {
  86. USART_SendData(UARTB,(data>>24) & 0xff);
  87. USART_SendData(UARTB,(data>>16) & 0xff);
  88. USART_SendData(UARTB,(data>>8 ) & 0xff);
  89. USART_SendData(UARTB,(data>>0 ) & 0xff);
  90. }
  91. void gpio_oled_config()
  92. {
  93. GPIO_OLED_CONFIG_CLOCK;
  94. GPIO_OLED_CONFIG_MOSI;
  95. GPIO_OLED_CONFIG_MISO;
  96. GPIO_OLED_CONFIG_CS;
  97. }
  98. int main(void)
  99. {
  100. GPIO_CONFIG(20)= GPCFG_JTAG_SWCLK;
  101. GPIO_CONFIG(21)= GPCFG_JTAG_SWDAT;
  102. uint32_t i=0x1000000;
  103. UartxInit(UARTB); //print log
  104. while(i--){}
  105. systick_init();
  106. printf("/****************spi test start****************/");
  107. SPI_InitTypeDef SPI_InitStruct;
  108. SPI_InitStruct.SPI_BaudSpeed = SPI_BAUDSPEED_750KHz;
  109. SPI_InitStruct.SPI_CPHA = SPI_CPHA_Second_Edge;
  110. SPI_InitStruct.SPI_CPOL = SPI_CPOL_Active_Low;
  111. SPI_InitStruct.SPI_Mode = SPI_Mode_Four_Wire;
  112. SPI_InitStruct.SPI_RXlen = 0x0a;
  113. SPI_InitStruct.SPI_TXLen = 0x0a;
  114. gpio_oled_config();
  115. SPI_Init(&SPI_InitStruct);
  116. init_lcd();
  117. SPI_LCD_Test();
  118. while(1)
  119. {
  120. }
  121. }
  122. /**********************************OLED FUN ***********************************/
  123. void clr_a0(void)
  124. {
  125. gpio_output_low_level(GPIO_OLED_CONFIG_A0);
  126. }
  127. void set_a0(void)
  128. {
  129. gpio_output_high_level(GPIO_OLED_CONFIG_A0);
  130. }
  131. void spi_write_data(unsigned char data)
  132. {
  133. set_a0();
  134. SPI_SendData(data);
  135. }
  136. void spi_write_cmd(unsigned char cmd)
  137. {
  138. clr_a0();
  139. SPI_SendData(cmd);
  140. }
  141. void write_byte_lcd(unsigned char data, unsigned char cmd)
  142. {
  143. if (LCD_RS_CMD == cmd)
  144. {
  145. spi_write_cmd(data);
  146. }
  147. else if (LCD_RS_DATA == cmd )
  148. {
  149. spi_write_data(data);
  150. }
  151. }
  152. void write_bytes_lcd(unsigned char* pdata, unsigned char len, unsigned char cmd)
  153. {
  154. unsigned char m = 0;
  155. if (LCD_RS_CMD == cmd )
  156. {
  157. for (m = 0;m < len ; m++)
  158. {
  159. spi_write_cmd(pdata[m]);
  160. }
  161. }
  162. else if (LCD_RS_DATA == cmd )
  163. {
  164. for (m = 0;m < len ; m++)
  165. {
  166. spi_write_data((int)(pdata[m]));
  167. }
  168. }
  169. }
  170. void clr_screen(void)
  171. {
  172. int i,page;
  173. for(page=0;page<8;page++)
  174. {
  175. spi_write_cmd(0x10);
  176. spi_write_cmd(0x00);
  177. spi_write_cmd(page+0xb0);
  178. for (i=0;i<128;i++)
  179. {
  180. spi_write_data(0);
  181. }
  182. }
  183. }
  184. void full_screen(void)
  185. {
  186. int i,page;
  187. for(page=0;page<8;page++)
  188. {
  189. spi_write_cmd(0x10);
  190. spi_write_cmd(0x00);
  191. spi_write_cmd(page+0xb0);
  192. for (i=0;i<128;i++)
  193. {
  194. spi_write_data(0xFF);
  195. }
  196. }
  197. }
  198. void set_xy(unsigned char column, unsigned char page)
  199. {
  200. unsigned char cmd[3];
  201. cmd[0] = 0xb0 | page;
  202. cmd[1] = 0x10 | (column >> 4);
  203. cmd[2] = 0x00 | (column & 0x0f);
  204. write_bytes_lcd(cmd,3,LCD_RS_CMD);
  205. }
  206. void init_lcd(void)
  207. {
  208. gpio_output_high_level(GPIO_OLED_CONFIG_A0);
  209. gpio_output_high_level(GPIO_OLED_CONFIG_RES);
  210. delay_ms(20);
  211. gpio_output_low_level(GPIO_OLED_CONFIG_RES);
  212. delay_ms(100);
  213. gpio_output_high_level(GPIO_OLED_CONFIG_RES);
  214. delay_ms(10);
  215. spi_write_cmd(0xe2);//reset
  216. delay_ms(10);
  217. spi_write_cmd(0xa0);//SEG Direction
  218. delay_ms(10);
  219. spi_write_cmd(0xc8);//COM Direction
  220. delay_ms(10);
  221. spi_write_cmd(0xa2);//Bias Select
  222. delay_ms(10);
  223. spi_write_cmd(0x2f);//Power Control
  224. delay_ms(10);
  225. spi_write_cmd(0x24);//Regulation Ratio
  226. delay_ms(10);
  227. spi_write_cmd(0x81);//Set EV_1
  228. delay_ms(10);
  229. spi_write_cmd(0x2f);//Set EV_2
  230. delay_ms(10);
  231. spi_write_cmd(0xaf);//Display ON
  232. delay_ms(10);
  233. clr_screen();
  234. set_xy(100, 1);
  235. write_byte_lcd(0x00, LCD_RS_DATA);
  236. }
  237. void SPI_LCD_Test(void)
  238. {
  239. unsigned char i;
  240. unsigned char Bmp001[24 * 6]={
  241. 0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x00,0x00,0x00,0x00,0xFE,
  242. 0xFC,0x00,0x00,0x00,0x00,0x00,0xE0,0xC0,0x00,0x00,0x00,0x00,
  243. 0x00,0x00,0x00,0x08,0x0F,0x07,0x00,0x00,0x00,0xC0,0xFC,0x3F,
  244. 0x3F,0xF0,0xC0,0x00,0x0C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,
  245. 0x00,0x20,0x60,0x70,0x30,0x38,0x1C,0x0E,0x07,0x03,0x00,0x00,
  246. 0x00,0x00,0x03,0x07,0x0E,0x1C,0x18,0x38,0x30,0x70,0x10,0x00
  247. };
  248. clr_screen();
  249. for(i = 0; i < 6; i++)
  250. {
  251. set_xy(10,i+2);
  252. write_bytes_lcd(&Bmp001[24*i], 24, LCD_RS_DATA);
  253. }
  254. }