CH455G.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. /*
  2. * File: CH455.c
  3. * Author: JiangXiaowei
  4. */
  5. #include "ch455g.h" // 修改该文件以适应硬件环境/单片机型号等
  6. #include "delay.h"
  7. #include "../globalDef.h"
  8. #include "uart_conf.h"
  9. //定义
  10. #define I2C_DELAY 10
  11. #define CH455H_LED_NUM 16
  12. uint32_t ch455h_Time_duty[CH455H_LED_NUM]; //占空比
  13. uint8_t ch455h_Time_en[CH455H_LED_NUM]; //使能
  14. uint8_t ch455h_Time_en_process; //全局使能
  15. extern OS_SEM i2c_sem;
  16. void CH455_Init(void)
  17. {
  18. GPIO_InitTypeDef GPIO_InitStructure;
  19. //return;
  20. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB时钟
  21. //stm32f103中PB3、PB4、PA15为JTAG引脚,若要作为普通IO口来使用的话,要禁用JTAG功能。
  22. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  23. //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  24. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
  25. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//普通输出模式
  26. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  27. GPIO_Init(GPIOB, &GPIO_InitStructure);
  28. GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
  29. CH455_Write( CH455_7SEG_ON ); //八段式
  30. //EXTI_MY_INIT();
  31. }
  32. void CH455H_SCL_D_OUT(void)
  33. {
  34. GPIO_InitTypeDef GPIO_InitStructure;
  35. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  36. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//普通输出模式
  37. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  38. GPIO_Init(GPIOB, &GPIO_InitStructure);
  39. delay_us(I2C_DELAY);
  40. }
  41. void CH455H_SDA_D_OUT(void)
  42. {
  43. GPIO_InitTypeDef GPIO_InitStructure;
  44. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  45. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//普通输出模式
  46. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  47. GPIO_Init(GPIOB, &GPIO_InitStructure);
  48. delay_us(I2C_DELAY);
  49. }
  50. void CH455H_SDA_D_IN(void)
  51. {
  52. GPIO_InitTypeDef GPIO_InitStructure;
  53. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  54. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  55. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  56. GPIO_Init(GPIOB, &GPIO_InitStructure);
  57. delay_us(I2C_DELAY);
  58. }
  59. /*
  60. * 函数功能:IIC产生起始信号函数
  61. * 输入参数:无
  62. * 输出参数:无
  63. */
  64. void CH455_I2c_Start(void)
  65. {
  66. CH455_SDA_D_OUT;
  67. CH455_SCL_D_OUT;
  68. CH455_SCL = high; //SCL = high;
  69. //GPIO_SetBits(GPIOB,GPIO_Pin_7);
  70. delay_us(I2C_DELAY);
  71. CH455_SDA = high; //SDA = high;
  72. delay_us(I2C_DELAY);
  73. CH455_SDA = low; //SDA = low;
  74. delay_us(I2C_DELAY);
  75. CH455_SCL = low; //SCL = low;
  76. //GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  77. delay_us(I2C_DELAY);
  78. }
  79. /*
  80. * 函数功能:IIC产生停止信号
  81. * 输入参数:无
  82. * 输出参数:无
  83. */
  84. void CH455_I2c_Stop(void)
  85. {
  86. CH455_SDA_D_OUT;
  87. CH455_SCL = low; //SCL = low;
  88. delay_us(I2C_DELAY);
  89. CH455_SDA = low; //SDA = low;
  90. delay_us(I2C_DELAY);
  91. CH455_SCL = high; //SCL = high;
  92. delay_us(I2C_DELAY);
  93. CH455_SDA = high; //SDA = high;
  94. delay_us(I2C_DELAY);
  95. }
  96. /*
  97. * 函数功能:IIC发送一个字节
  98. * 输入参数:一个字节
  99. * 输出参数:无
  100. */
  101. void CH455_I2c_WrByte(unsigned char IIC_Byte)
  102. {
  103. unsigned char i;
  104. CH455_SDA_D_OUT;
  105. for(i = 0; i < 8; i++)
  106. {
  107. if(IIC_Byte & 0x80)
  108. CH455_SDA = high; //SDA=high;
  109. else
  110. CH455_SDA = low; //SDA=low;
  111. delay_us(I2C_DELAY);
  112. CH455_SCL = high; //SCL=high;
  113. delay_us(I2C_DELAY);
  114. delay_us(I2C_DELAY);
  115. CH455_SCL = low; //SCL=low;
  116. delay_us(I2C_DELAY);
  117. IIC_Byte<<=1;
  118. }
  119. delay_us(I2C_DELAY);
  120. CH455_SDA = high; //SDA=1;
  121. delay_us(I2C_DELAY);
  122. CH455_SCL = high; //SCL=1;
  123. delay_us(I2C_DELAY);
  124. CH455_SCL = low; //SCL=0;
  125. delay_us(I2C_DELAY);
  126. }
  127. unsigned char CH455_I2c_RdByte( void ) //读一个字节数据
  128. {
  129. unsigned char i, bytedata;
  130. CH455_SDA_D_IN; //将数据设置为输入模式
  131. delay_us(I2C_DELAY);
  132. CH455_SDA = 1; //数据线拉高
  133. delay_us(I2C_DELAY);
  134. CH455_SCL = 0;
  135. delay_us(I2C_DELAY);
  136. for(i = 0; i < 8; i++) //读8位数据
  137. {
  138. CH455_SCL = 1;
  139. delay_us(I2C_DELAY);
  140. bytedata <<= 1;
  141. delay_us(I2C_DELAY);
  142. bytedata |= (CH455_SDA_IN);
  143. delay_us(I2C_DELAY);
  144. CH455_SCL = 0;
  145. delay_us(I2C_DELAY);
  146. }
  147. CH455_SDA_D_OUT; //数据线设置回输出模式
  148. CH455_SDA = high; //SDA=1;
  149. delay_us(I2C_DELAY);
  150. CH455_SCL = high; //SCL=1;
  151. delay_us(I2C_DELAY);
  152. CH455_SCL = low; //SCL=0;
  153. delay_us(I2C_DELAY);
  154. return(bytedata);//返回数据
  155. }
  156. void CH455_Write( UINT16 cmd ) //写命令
  157. {
  158. CH455_I2c_Start(); //启动总线
  159. CH455_I2c_WrByte(((UINT8)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);
  160. //CH455_I2c_WrByte(((UINT8)(cmd)&CH455_I2C_MASK)|CH455_I2C_ADDR);
  161. CH455_I2c_WrByte((UINT8)cmd); //发送数据
  162. CH455_I2c_Stop(); //结束总线
  163. }
  164. UINT8 CH455_Read( void ) //读取按键
  165. {
  166. UINT8 keycode;
  167. CH455_I2c_Start(); //启动总线
  168. CH455_I2c_WrByte(((UINT8)(CH455_GET_KEY>>7)&CH455_I2C_MASK)|0x01|CH455_I2C_ADDR);
  169. keycode=CH455_I2c_RdByte(); //读取数据
  170. CH455_I2c_Stop(); //结束总线
  171. return keycode;
  172. }
  173. void CH455H_LED_test(void){
  174. static uint16_t led=0;
  175. CH455_Write( CH455_DIG0 | ((led>>0) & 0x0F));
  176. CH455_Write( CH455_DIG1 | ((led>>4) & 0x0F));
  177. CH455_Write( CH455_DIG2 | ((led>>8) & 0x0F));
  178. CH455_Write( CH455_DIG3 | ((led>>12) & 0x0F));
  179. led++;
  180. }
  181. /*-----------------------------------------------------------
  182. * 16 12 8 4
  183. * 15 11 7 3
  184. * 14 10 6 2
  185. * 13 9 5 1
  186. *------------------------------------------------------------*/
  187. void CH455H_LED_test00(short led){
  188. //static uint16_t led=0;
  189. OS_ERR err;
  190. OSSemPend(&i2c_sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  191. led = (((led & 0xaaaa) >> 1) | ((led & 0x5555) << 1));
  192. led = (((led & 0xcccc) >> 2) | ((led & 0x3333) << 2));
  193. led = (((led & 0xf0f0) >> 4) | ((led & 0x0f0f) << 4));
  194. led = (((led & 0xff00) >> 8) | ((led & 0x00ff) << 8));
  195. CH455_Write( CH455_DIG0 | ((led>>0) & 0x0F));
  196. CH455_Write( CH455_DIG1 | ((led>>4) & 0x0F));
  197. CH455_Write( CH455_DIG2 | ((led>>8) & 0x0F));
  198. CH455_Write( CH455_DIG3 | ((led>>12) & 0x0F));
  199. //led++;
  200. OSSemPost(&i2c_sem, OS_OPT_POST_ALL, &err);
  201. }
  202. void CH455H_LED_test2(void){
  203. static uint16_t led=0;
  204. CH455_Write( CH455_DIG0 | ((led>>0) & 0x0F));
  205. CH455_Write( CH455_DIG1 | ((led>>4) & 0x0F));
  206. CH455_Write( CH455_DIG2 | ((led>>8) & 0x0F));
  207. CH455_Write( CH455_DIG3 | ((led>>12) & 0x0F));
  208. led=~led;
  209. }
  210. void CH455H_LED_test3(void){
  211. static uint16_t led=0;
  212. CH455_Write( CH455_DIG0 | ((led>>0) & 0x0F));
  213. led++;
  214. led&=0x000F;
  215. }
  216. extern PtTest g_ptTest;
  217. /*--------------------------------------------------
  218. * 上电显示版本号 持续显示0.5s
  219. * -------------------------------------------------*/
  220. void led_display_version(void){
  221. uint16_t status = 0;
  222. //return;
  223. status = ((g_firmwareExpl.dd&0x0F00)<<4) |( g_firmwareMsg.gatewayMsg.verMsg.gate_appVr&0x0FFF);
  224. CH455H_LED_test00(status);
  225. delay_ms(1500);
  226. CH455H_LED_test00(0);
  227. delay_ms(1500);
  228. }
  229. void set_led_status(uint8_t index,uint8_t status)
  230. {
  231. //return;
  232. if(g_ptTest.bTestStart == 1) return;
  233. if(g_ledStatus.status == LED_DISP_LORA ) return;
  234. switch(index){
  235. case 0 :g_ledStatus.led16.led.led01 = status; break;
  236. case 1 :g_ledStatus.led16.led.led02 = status; break;
  237. case 2 :g_ledStatus.led16.led.led03 = status; break;
  238. case 3 :g_ledStatus.led16.led.led04 = status; break;
  239. case 4 :g_ledStatus.led16.led.led05 = status; break;
  240. case 5 :g_ledStatus.led16.led.led06 = status; break;
  241. case 6 :g_ledStatus.led16.led.led07 = status; break;
  242. case 7 :g_ledStatus.led16.led.led08 = status; break;
  243. case 8 :g_ledStatus.led16.led.led09 = status; break;
  244. case 9 :g_ledStatus.led16.led.led10 = status; break;
  245. case 10 :g_ledStatus.led16.led.led11 = status; break;
  246. case 11 :g_ledStatus.led16.led.led12 = status; break;
  247. case 12 :g_ledStatus.led16.led.led13 = status; break;
  248. case 13 :g_ledStatus.led16.led.led14 = status; break;
  249. case 14 :g_ledStatus.led16.led.led15 = status; break;
  250. case 15 :g_ledStatus.led16.led.led16 = status; break;
  251. default : break;
  252. }
  253. CH455H_LED_test00(g_ledStatus.led16.status);
  254. }
  255. /* 升级时显示 */
  256. void set_led_update_status(uint16_t status)
  257. {
  258. // return;
  259. if(g_ptTest.bTestStart == 1) return;
  260. if(g_ledStatus.status == LED_DISP_LORA ) return;
  261. CH455H_LED_test00(status);
  262. }
  263. /* 没有初始化时显示 */
  264. void set_led_no_init_sn(uint16_t status)
  265. {
  266. // return;
  267. if(g_ptTest.bTestStart == 1) return;
  268. if(g_ledStatus.status == LED_DISP_LORA ) return;
  269. CH455H_LED_test00(status);
  270. }
  271. /* 显示lora信道 编号 */
  272. void set_led_lora_index(uint16_t status)
  273. {
  274. if(g_ptTest.bTestStart == 1) return;
  275. if(g_ledStatus.status != LED_DISP_LORA ) return;
  276. CH455H_LED_test00(status);
  277. }