• STM32:GPIO模拟SPI驱动ADS8361


    ADS8361是TI公司开发的一款模拟量输入芯片。ADS8361有四种工作模式,本文主要针对模式三进行通信驱动。官方方案使用两路SPI来通信,一路SPI Master,一路SPI Slave。我在使用STM32主控芯片的两路SPI进行通信的时候,发现只有SPI Master这路可以正常工作。Slave一直无法接收到数据。估计是两路SPI同时通信会有问题。所以使用了GPIO模拟SPI来驱动ADS8361。

    硬件系统接线示意图:

    模式三通信时序图:

     

     下面是驱动程序:

    1. /*Global variables*/
    2. float Ain1, Ain2 , Ain3;
    3. static float Calculate_Volt_By_SPI_Data(uint8_t* data)
    4. {
    5. uint32_t temp1, temp2, temp3, temp4;
    6. temp1 = data[0] & 0X1F;
    7. temp2 = data[1];
    8. temp3 = data[2] >> 5;
    9. temp4 = temp1 * 2048 + temp2 * 8 + temp3;
    10. if(temp4 >= 0x8000)
    11. {
    12. temp4 -= 0x8000;
    13. }
    14. else
    15. {
    16. temp4 += 0x8000;
    17. }
    18. return 10.0 - (float)temp4/65535*20;
    19. }
    20. static void Monitor_AIN_Level(void)
    21. {
    22. uint8_t SPI1_RD[3] = {0x00, 0x00, 0x00};
    23. uint8_t SPI2_RD[3] = {0x00, 0x00, 0x00};
    24. uint8_t Invalid_ARR[3] = {0x00, 0x00, 0x00};
    25. for(int i = 0; i < 20; i++)
    26. {
    27. HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port, SPI1_SCK_Pin, GPIO_PIN_SET);
    28. if(i == 0)
    29. {
    30. HAL_GPIO_WritePin(SPI1_MOSI_GPIO_Port, SPI1_MOSI_Pin, GPIO_PIN_SET);
    31. }
    32. else if(i == 1)
    33. {
    34. HAL_GPIO_WritePin(SPI1_MOSI_GPIO_Port, SPI1_MOSI_Pin, GPIO_PIN_RESET);
    35. }
    36. delay_us(1);
    37. HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port, SPI1_SCK_Pin, GPIO_PIN_RESET);
    38. if(HAL_GPIO_ReadPin(SPI1_MISO_GPIO_Port, SPI1_MISO_Pin) == GPIO_PIN_SET)
    39. {
    40. SPI1_RD[i/8] += (1 << (7 - (i % 8)));
    41. }
    42. if(HAL_GPIO_ReadPin(SPI2_MOSI_GPIO_Port, SPI2_MOSI_Pin) == GPIO_PIN_SET)
    43. {
    44. SPI2_RD[i/8] += (1 << (7 - (i % 8)));
    45. }
    46. delay_us(1);
    47. }
    48. HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port, SPI1_SCK_Pin, GPIO_PIN_RESET);
    49. if(memcmp(SPI1_RD, Invalid_ARR, sizeof(SPI1_RD)) == 0 || memcmp(SPI2_RD, Invalid_ARR, sizeof(SPI2_RD)) == 0)
    50. {
    51. return;
    52. }
    53. if(SPI1_RD[0] >= 0x60 || SPI2_RD[0] >= 0x60)
    54. {
    55. return;
    56. }
    57. if((SPI1_RD[0] & 0x40) > 0) Ain2 = Calculate_Volt_By_SPI_Data(SPI1_RD);
    58. else Ain1 = Calculate_Volt_By_SPI_Data(SPI1_RD);
    59. if((SPI2_RD[0] & 0x40) == 0) Ain3 = Calculate_Volt_By_SPI_Data(SPI2_RD);
    60. //Usart_Printf("Ain1: %f\n", Ain1);
    61. //Usart_Printf("Ain2: %f\n", Ain2);
    62. //Usart_Printf("Ain3: %f\n", Ain3);
    63. }

     三路模拟量输入通道的测试结果:

  • 相关阅读:
    阻塞、非阻塞、同步、异步
    【寒武纪(13)】BANGC 报错 stack smashing detected
    git命令行学习二
    LTD248次升级 | 竞赛数字化:在线答题赛、反复多轮赛,答题领取现金 • 官微名片展示个人简介 • 官网可搜索各类文件
    内部振荡器、无源晶振、有源晶振有什么区别?
    【微服务 31】超细的Spring Cloud 整合Seata实现分布式事务(排坑版)【云原生】
    java继承简介说明
    php语言
    抖音自媒体运营的5个技巧,让你的账号快速涨粉
    【Linux】解决切换用户出现bash-4.2$问题
  • 原文地址:https://blog.csdn.net/xikangsoon/article/details/133768432