You can use the following WooCommerce filters for that:
woocommerce_apply_individual_use_coupon (must return an array with already applied coupons that may be kept) woocommerce_apply_with_individual_use_coupon (must return a boolean whether a coupon can be applied while there are individual use coupons in the cart)
Here’s the simple code for others trying to do the same thing. Unfortunately, the coupon object doesn’t declare whether the coupon has a free item. However, all of our coupons for Free Products have a discount amount of 0.