CH455G.c 8.5 KB

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